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

时间:2019-06-03 08:26:33

标签: perl csv

我在文本文件中有一个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

我想将其导出为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  

我尝试执行以下操作

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;
}

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

,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  

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

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  

无论如何这样做? 谢谢。

2 个答案:

答案 0 :(得分:5)

有几个步骤可以解决此问题。我将不只是将答案交给您,而是要逐步介绍这些步骤,并为您提供一些可在每个阶段帮助您的功能的文档。

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

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

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

答案 1 :(得分:0)

这样的作品可以吗?

use strict;
use warnings;

open my $fh, '<', 'text.txt';
open my $fo, '>', 'text.csv';
while (<$fh>) {
    s/^\s+//;
    s/\b \b/_/g;
    my $text = (join ',', (split /\s+/, $_))."\n";
    print $fo $text;
}