0

我有许多需要清理的 csv 文件(用空格替换标点符号并用其他单词替换某些单词......)我的 csv 文件有两列,在每一列中我用其他的替换一些字符。例如,在第一列中我替换 ; 由 xxx 并在第二列中替换;通过 ppp。为此,我在正则表达式中有两个 perl 代码,并在两个文件上切片一个 csv 文件:文件 1 = 第一列和文件 2 = 第二列,我运行第一列文件中第一列的代码.. .. 这根本不是一个好方法 :s !!!

那么我怎样才能有一个代码,其中第一个条件在 SAME 文件的第一列上运行,第二个条件在 SAME 文件的第二列上运行?

CSV 示例: http ://dbpedia.org/resource/Berenguer_de_Cru%C3%AFlles Berenguer de Cruïlles http://dbpedia.org/resource/Berenguer_de_Cru%C3%AFlles Berenguer de Cruïlles

IRI 是第一列,名称在第二列。

第一列的正则表达式中的 Perl 代码:

use strict;
use warnings;

open(IN,$ARGV[0]);
open(OUT,">RES_xxx.txt");
while(my $l = <IN>)
{
 chomp($l);
     $l =~ s/http:\/\//_/g;
     $l =~ s/,/vvv/g;
     $l =~ s/"/=/g;
     $l =~ s/'/#/g;
     $l =~ s/\(/ééé/g;
     $l =~ s/\)/èèè/g;
     $l =~ s/%/zzz/g;

     print OUT "$l\n";
}
close(IN);
close(OUT);

第二列的正则表达式中的 Perl 代码:

   #! usr/bin/perl

    use strict;
    use warnings;

    open(IN,$ARGV[0]);
    open(OUT,">RES_xxx.txt");
    while(my $l = <IN>)
    {
     chomp($l);
     $l =~ s/\(.+\)/ /g;
     $l =~ s/'/ /g;
     $l =~ s/"/ /g;
     $l =~ s/,/ /g;
     $l =~ s/\./ /g;
     $l =~ s/:/ /g;
     $l =~ s/;/ /g;
     $l =~ s/!/ /g;
     $l =~ s/\?/ /g;
     $l =~ s/-/ /g;
     $l =~ s/_/ /g;
     $l =~ s/{/ /g;
     $l =~ s/}/ /g;
     $l =~ s/\+/ /g;
     $l =~ s/=/ /g;

     print OUT "$l\n";
    }
    close(IN);
    close(OUT);

谢谢 !

4

1 回答 1

1

您可以通过分两步解析文件来做到这一点:

  1. 第一步,替换;原始文件第一列中的 ;

  2. 在第二步中,替换第一步;输出的第二列中的 。

这应该从您当前的解决方案中轻松完成:我想您有一个正则表达式来匹配第一列和第二列。您可以简单地更改这些正则表达式,而不是匹配第一列或第二列,而是在该列中替换它们。

如果您提供有关文件的更多详细信息以及当前如何拆分两列,我可能会提供一些具体示例。

编辑:

由于您似乎只有两列并且每列都不包含任何逗号,因此您可以这样做:

  1. 逐行解析文件;

  2. 在(列之间的分隔符)处拆分行,

  3. 在您在第 2 步得到的每个部分上,应用正则表达式来替换您想要的。

例如:

my $file = 'file.csv';
open(my $fh, '<', $file) or die "Can't read file '$file' [$!]\n";
while (my $line = <$fh>) {
  chomp $line;
  my ($firstCol, $secondCol) = split(/,/, $line);
  $firstCol =~ s/;/xxx/g;
  $secondCol =~ s/;/yyy/g;
  print "$firstCol, $secondCol\n";
}
于 2012-09-11T10:28:16.810 回答