如何将文本文件的每一行写入CSV

geo*_*rea 1 csv perl

我在文本文件中有一个netflow信息报告,我想将它们导出为csv格式,如何在Perl中做到这一点?我是Perl的新手,只是开始学习它。

这是文本文件:

Duration    Flags    
10.10.10.1      10.10.11.11    51251    445      2019-03-05 11:59:29.008   29.156     ......
10.10.10.2      10.10.11.22    51234    123      2019-03-05 11:40:29.008   30.156     .A..SF
Run Code Online (Sandbox Code Playgroud)

我想将其导出为ex​​cel格式,如下所示。

10.10.10.1,10.10.11.11,51251,445,2019-03-05 11:59:29.008,29.156,......  
10.10.10.2,10.10.11.22,51234,123,2019-03-05 11:59:29.008,30.156,.A..SF  
Run Code Online (Sandbox Code Playgroud)

我试图做如下

use strict;
use warnings;

open my $fh, '<', 'file.txt';
open my $fo, '>', 'file.csv';
while (<$fh>) {
   next if ($. == 1);
   s/\b \b/,/g;
   my $text = (join ',', (split /\s+/, $_))."\n";
   print $fo $text;
}
Run Code Online (Sandbox Code Playgroud)

但结果是开始的每一行都会再加上一个',',如下所示,

,10.10.10.1,10.10.11.11,51251,445,2019-03-05 11:59:29.008,29.156,......  
,10.10.10.2,10.10.11.22,51234,123,2019-03-05 11:59:29.008,30.156,.A..SF  
Run Code Online (Sandbox Code Playgroud)

这就是我想要的,我的代码有什么问题?

10.10.10.1,10.10.11.11,51251,445,2019-03-05 11:59:29.008,29.156,......  
10.10.10.2,10.10.11.22,51234,123,2019-03-05 11:59:29.008,30.156,.A..SF  
Run Code Online (Sandbox Code Playgroud)

无论如何这样做?谢谢。

Dav*_*oss 5

有几个步骤可以解决此问题。我将不仅仅将答案提供给您,还将逐步指导您完成这些步骤,并为您提供一些可在每个阶段帮助您的功能的文档。

  1. 您需要打开两个文件句柄-一个用于读取数据,另一个用于将(转换后的)数据写入其中。该open()函数用于打开文件并将该文件附加到文件句柄,您可以使用该句柄从文件中读取数据。
  2. 然后,您将要从输入文件句柄中读取数据。您可以为此使用文件输入运算符< ... >)。
  3. 然后,您需要将输入行拆分为各个字段。Perl具有一个巧妙的split()功能。
  4. 然后,您需要根据拆分后的输入数据构造CSV记录。您可以考虑为此使用Text :: CSV模块,但是在这种(简单)情况下,您可以使用join()
  5. 您需要将CSV记录写入输出文件。您可以使用进行操作print()
  6. 最后,您将需要关闭两个文件句柄-与close()

我故意遗漏了您的问题的一个有趣的角落。每个人都需要一个肉类问题才能进入牙齿,对吗?:-)

可以根据这些信息编写一些东西,如果您还有其他问题,请随时在这里提问。