使用perl从csv中提取数据

时间:2014-04-17 22:30:35

标签: perl csv extract large-files

我有一个充满数据的大量csv文件,我只需要提取保留逗号的是/否(1-16部分)并在完成循环后打破新行

以下是数据的快照

Firstname: xxx
Lastname: xxx
Email: xxx@xxx.net
Phone: xxxxxxxxxx
IP Address: xxx.xxx.xxx.xxx",,,,,,,,,,,,,,,,
xxxx,Suttle,OR,United States,xxxxxx@xxx.com,xxxxxxxxxx,xxxx xxxx,"UnkNo,wn",Long Form,New,23/xxxxx,xxx.xxx.xxx.xxx,4/17/2014 13:45,4/17/2014 13:45,S3S - Survival,xxxxxx.com,4/17/2014 0:00,4/17/2014 13:45,"  
1.  No,
2.   No,
3.  No,
4.  No,
5.  No,
6.  No,
7.  No,
8.  No,
9. No,
10.  No,
11.  No,
12. No,
13.  No,
14.  No,
15.  No,
16.  Yes,

我尝试使用我能想到的每种方法提取上面的是/否数据,但我仍然无法正确提取!任何建议,欣喜地赞赏

所需的输出位于CSV文件中,如下所示 http://pastebin.com/LerQ9vE4

2 个答案:

答案 0 :(得分:0)

open my $fin, "your.file";
my $str;
for (<$fin>) {                # read line into $_ variable
  if (/^\s*\d+\.\s*(\w+)/) {  # extract word from $_
    $str .= $1 . ",";         # append word and comma to $str
  }
}
print $str;

答案 1 :(得分:0)

这应该有效:

use strict;
use warnings;
use autodie;

open my $fh, "<", "csvfile"; 
open my $op, ">", "output.txt";

my $flag;

while(<$fh>) {
    if ($_ =~ /\d+\.\s*(\w+,)/) {
        print $op "\n" if ($flag eq "Y");
        $flag = "N";
        print $op "$1";
    } else {
        $flag = "Y";
    }
}
  • 一次使用while loop一行读取。
  • 针对正则表达式测试当前行,该正则表达式指出:
    • 查找以一个或多个数字^\d+
    • 开头的行
    • 后跟一个文字点.
    • 后面跟着零空格\s*
    • 使用(\w+,)的捕获组捕获任何单词后跟,
  • 如果与正则表达式匹配,则打印该行。