需要在textwrangler - grep中使用正则表达式查找和替换csv文件

时间:2011-01-03 16:54:15

标签: regex grep textwrangler

我有这个csv文件,纯文本在这里:http://pastie.org/1425970

excel中的内容:http://cl.ly/3qXk

我希望它看起来像一个例子(仅使用第一行作为示例):http://cl.ly/3qYT

第一行的纯文本:http://pastie.org/1425979

我需要创建一个csv文件,将所有信息导入数据库表。

我可以手动创建csv,但是我想看看是否可以使用textwrangler(grep)中的正则表达式查找和替换

3 个答案:

答案 0 :(得分:1)

正则表达式并不是实现此目的的最佳方法。正如其他人所说,你最好编写一些代码来将文件解析成你想要的格式。

话虽如此,这个丑陋的正则表达式应该让你到达那里:

查找

(\d+),"?(?:(\d+),? ?)?(?:(\d+),? ?)?(?:(\d+),? ?)?(?:(\d+),? ?)?(?:(\d+),? ?)?(?:(\d+),? ?)?(?:(\d+),? ?)?"?

替换:

\1,\2\r\1,\3\r\1,\4\r\1,\5\r\1,\6\r\1,\7\r\1,\8

这将为您留下一些额外的行,如下所示:

1,1
1,8
1,11
1,13
1,
1,
1,
2,10
2,11
2,12
2,
2,
...

您可以手动或使用以下正则表达式清理额外的行:

查找

\d+,\r

替换:

(empty string)

答案 1 :(得分:0)

使用Perl,您可以这样做:

open(my $read,"<","input.csv") or die ("Gah, couldn't read input.csv!\n"); open(my $write,">","output.csv") or die ("WHAAAARGARBL!\n"); while(<$read>) { chomp; if(/(\d+),"(.*)"/) { my @arr=split(/,/,$2); foreach(@arr) { print $write $1.",".$2."\n"; } } } close($read); close($write);

答案 2 :(得分:0)

我不知道文字。但总的来说,我可以描述在伪代码中执行此操作所需的内容。

loop, read each line  
   strip off the newline
   split into an array using /[, "]+/ as delimeter regex
   loop using result. an array slice from element 1 to the last element
       print element 0, comma, then itterator value
   end loop
end loop

在Perl中,类似这样......

while ($line = <DATA> ) {
    chomp $line;
    @data_array = split /[, "]+/, $line;
    for $otherfield ( @data_array[ 1 .. $#data_array ]) {
        print "$data_array[0], $otherfield\n";
    }
}

如果你有分裂能力应该很容易。