![]() |
|
|
google unix.com
|
|||||||
| Forum | Registrera | Forum Regler | Länkar | Album | FAQ | Medlemslista | Kalender | Söka | Dagens inlägg | Markera forum som lästa |
| 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 |
![]() |
|
|
LinkBack | Thread Tools | Sök i denna tråd | Rate Thread | Visningslägen |
|
|
|
||||
|
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? |
|
||||
|
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.
|
|
||||
|
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 +)? |
|
||||
|
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.. |
![]() |
| Komihåglista |
| Taggar |
| perl, perl regex, regex |
| Thread Tools | Sök i denna tråd |
| Visningslägen | Betygsätt denna tråd |
|
|