2014-09-13 68 views
1

我想解析日誌文件並將它們轉換爲.csv文件。我在分割功能方面遇到問題。例如,我在日誌文件中有以下內容:21a94551,00:00:59.643; ERROR;。當我嘗試分割逗號(,)和分號(;)時,輸出csv文件中的時間戳將丟失.643。我想保持完整的時間(00:00:59.643)。我在日誌文件中有多行(全部使用不同的數字),所以這些值不是顯式的。使用Text :: CSV_XS分割函數

當我使用拆分後打印功能函數值被輸出到屏幕上確定,但在CSV文件

我是新來的Perl。有人能解釋我做錯了什麼嗎?我認爲這個問題可能與字符串的處理方式有關。

use strict; 
use Cwd; 
use Excel::Writer::XLSX; 
use Text::CSV_XS; 
use Spreadsheet::Read; 

my $dirname = getcwd;    # Set the directory to current working directory. 
opendir (DIR, $dirname) || die;  # Open the current directory 
my @FileNameList = readdir(DIR); # Load the names of files in to an array 

foreach (@FileNameList)    #Read each of the file names 
{ 
    my $FileName = $_; 
    my $Output; 

    if ($FileName =~ m/iusp_\d+.log/) 
     { 
     print ("\n". $FileName." \n Correct Log File Found"); 

open (my $file, "<", $FileName); 

while (<$file>) { 
     chomp; # Remove the \n from the last field 
     my $Line = $_; # Create the variable SLine and place the contents of the current line there 

     if ($Line =~ m/ERROR/) # Select any line that has "ERROR" inside it. 
     { 
      my @fields = split /[,;]/, $Line; # Split up the line $Line by ", ;" 
      my $csv = Text::CSV_XS->new();   # Create new CSV 
      $csv->combine(@fields); 
      my $csvLine = $csv->string(); 
      print $csvLine, "\n"; 
      { 
       $Output = $csvLine . "\n"; 
      } 
      my $OutputFileName = $FileName . ".csv"; 
      print("\n Saving File:" . $OutputFileName); 
      open(MyOutputFile, ">>$OutputFileName"); 
      print MyOutputFile $Output; 
     } #End of IF Statement 
    } #End of while statement 

回答

6

簡化你的正則表達式。您不需要.*perldoc -f split)。該點由split作爲分隔符處理,因爲它位於字符類方括號內。

use warnings; 
use strict; 
use Data::Dumper; 

my $Line = '21a94551,00:00:59.643;ERROR;'; 
my @fs = split /[,;]/, $Line; 
print Dumper(\@fs); 

__END__ 
$VAR1 = [ 
      '21a94551', 
      '00:00:59.643', 
      'ERROR' 
     ]; 
+0

謝謝你,我想,和它的作品在屏幕上,但沒有得到的結果相同.csv文件。 – 2014-09-14 11:07:25

+0

不客氣。我建議如下。 1.接受提供的答案之一,因爲他們解決您的原始問題。 2.發佈一個新問題,但在此之前...... 3.刪除與您的問題無關的所有代碼(請閱讀http://sscce.org和http://perlmonks.org/?node_id=745674) – toolic 2014-09-14 12:30:35

2

[]裏面有什麼不是正則表達式,它是一組字符或字符範圍或類。你告訴它拆就,.*;當你只是想拆就,;split /[,;]/, ...