The UNIX and Linux Forums  

Go Back   UNIX och Linux Forum > Upp Forum > Shell-programmering och Skript
.
google unix.com



Shell-programmering och Skript Post frågor om ksh, CSH, SH, bash, PERL, PHP, sed, awk och andra skalskript och skal skriptspråk här.

Mer UNIX och Linux Forum Ämnen Du kan hitta Helpful
Tråd Thread Starter Forum Svar Senaste Inlägg
regex fråga xiamin Shell-programmering och Skript 3 03-05-2009 02:53
Perl Regex hjälp - matchande parenteser CVP Shell-programmering och Skript 7 02-27-2009 05:38
Hur lägger jag band här raden använder perl regex. ramky79 Shell-programmering och Skript 1 03-18-2008 12:10
regex fråga arushunter Shell-programmering och Skript 8 01-04-2007 05:49
regex fråga rocketkids UNIX for Dummies Frågor & Svar 6 02-12-2004 05:49

Closed Thread
English Japanese Spanish French German Portuguese Italian Dutch Swedish Russian Norwegian Hungarian Hebrew Danish Bulgarian Greek Powered by Powered by Google
 
LinkBack Thread Tools Sök i denna tråd Rate Thread Visningslägen
  #1 (permalänk)  
Old 07-16-2008
Figaro figaro is offline
Registered User
  
 

Join Date: Jan 2007
Inlägg: 268
Perl Regex fråga

Jag har följande kod:

Kod:
#!/usr/bin/perl -w

@files = <*.csv>;
foreach $file (@files) {
  open(FH, $file) || die("Error: Cannot open file $file for reading.");
  my @dt = ($file =~ /^(\w+).(\d{6})\.csv$/);
  while (<FH>) { 
    print "@dt[0] $_\n";
  }
  close(FH);
}

Det finns redundans i koden som det första kontrollerna för alla filer som slutar med ". Csv" (linje 3) och därefter analyserar filnamnet (linje 6) letar efter tecken och siffror. Hur ändrar jag linje 3 i ett reguljärt uttryck, så att linje 6 kan tas bort och kedjan @ dt bestäms det?
  #2 (permalänk)  
Old 07-16-2008
KevinADC KevinADC is offline Forum Advisor  
Registered User
  
 

Join Date: Jan 2008
Inlägg: 731
Du kan inte. Och det är verkligen ingen redundans som Glob <> första hittar alla filer med. Csv förlängningen så att du kan öppna dem, regexp sedan analyserar dessa strängar (filnamnen) för att extrahera mer specifik information.
  #3 (permalänk)  
Old 07-16-2008
KevinADC KevinADC is offline Forum Advisor  
Registered User
  
 

Join Date: Jan 2008
Inlägg: 731
Tja, jag har kommit fram till detta, men det kan inte vara mer effektiva än vad ni hade och kanske vara mindre effektiv, du måste riktmärke både koder för att veta vilka som egentligen är bäst.


Kod:
my %files = map {/^(\w+).\d{6}\.csv$/; $_ => $1} <*.csv>;
print Dumper \%files;
foreach my $file (keys %files) {
  open(FH, $file) || die("Error: Cannot open file $file for reading.");
  while (<FH>) { 
    print "$files{$file} $_\n";
  }
  close(FH);
}

detta regexp förmodligen behöver raffinering:

/ ^ (\ w +). \ d (6) \. csv $ /

vilken är den punkt i det för efter (\ w +)?
  #4 (permalänk)  
Old 07-17-2008
Figaro figaro is offline
Registered User
  
 

Join Date: Jan 2007
Inlägg: 268
Tack för ditt svar och har experimenterat med det här lite. Prestanda vinst (eller förlust) är ringa. Am fortfarande arbetar med en inbyggd timer, men skillnaden är bara sekunder (om någon) på totalt kropp ungefär 200 filer och kombinerade kräver 40 MB.

Och punkt (.) Är den del av filnamnet: w + är standard filnamn och d (6) är 24hr Temne av tiden för hämtning. Så en fil skulle ha ett namn såsom scores.234506.csv

Senast redigerad av Figaro, 07-17-2008 vid 02:09..
  #5 (permalänk)  
Old 07-17-2008
KevinADC KevinADC is offline Forum Advisor  
Registered User
  
 

Join Date: Jan 2008
Inlägg: 731
pricken bör flydde sedan, liksom de andra punkten i regexp:

min% filer \u003d karta (/ ^ (\ w +) \. \ d (6) \. csv $ /, $ _ \u003d> $ 1) <*. csv>;
  #6 (permalänk)  
Old 07-17-2008
ghostdog74 ghostdog74 is offline Forum Advisor  
Registered User
  
 

Join Date: Sep 2006
Inlägg: 2557
om filnamnen är alltid namngivna gillar scores.234506.csv kan du bara använda delade på prickar och sedan få array element 1. Det borde vara ditt nummer. Lättare än regexp.
  #7 (permalänk)  
Old 07-18-2008
KevinADC KevinADC is offline Forum Advisor  
Registered User
  
 

Join Date: Jan 2008
Inlägg: 731
split () är ett regexp.
Closed Thread

Komihåglista

Taggar
perl, perl regex, regex

Thread Tools Sök i denna tråd
Sök i denna tråd:

Avancerad sökning
Visningslägen Betygsätt denna tråd
Betygsätt denna tråd:

Utstationering Regler
Du får inte efter nya trådar
Du får inte efter svar
Du får inte skicka bilagor
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG] kod
HTML-koden är Av
Trackback är
Pingbacks är
Refbacks är




Alla tider är GMT -4. Klockan är nu 04:33.


Powered by: vBulletin, Copyright © 2000 - 2006, Jelsoft Enterprises Limited. Översättningar Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
UNIX och Linux Forum Innehållet upphovsrättsskyddat © 1993-2009. All Rights Reserved.Ad förvaltning RedTyger

Content Relevant webbadresser från vBSEO 3.2.0