0

クリーンアップする必要のあるcsvファイルがたくさんあります(句読点をスペースに置き換え、特定の単語を他の単語に置き換えます...)csvファイルには2つの列があり、それぞれにいくつかの文字を他の文字に置き換えます。たとえば、最初の列で;を置き換えます。xxxで、2番目の列で;を置き換えます。pppによる。これを行うには、正規表現に2つのperlコードがあり、1つのcsvファイルを2つのファイルにスライスします。ファイル1=最初の列とファイル2= 2番目の列で、最初の列のファイルの最初の列のコードを実行します。 ..それはまったく良い方法ではありません:s !!!

では、同じファイルの最初の列で最初の条件が実行され、2番目の列で2番目の条件が実行される1つのコードを作成するにはどうすればよいですか?

CSVの例: http : //dbpedia.org/resource/Berenguer_de_Cru%C3%AFllesBerenguerdeCruïlleshttp //dbpedia.org/resource/Berenguer_de_Cru%C3%AFllesBerenguerdeCruïlles

IRIは最初の列で、名前は2番目の列にあります。

最初の列の正規表現の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);

2番目の列の正規表現の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

これは、ファイルを2つのステップで解析することで実行できます。

  1. ;最初のステップで、元のファイルの最初の列のを置き換えます。

  2. ;2番目のステップでは、最初のステップの出力の2番目の列のを置き換えます。

これは、現在のソリューションから簡単に実行できるはずです。最初の列と2番目の列に一致する正規表現があると思います。これらの正規表現を変更するだけで、最初または2番目の列を一致させる代わりに、その列内で置き換えることができます。

ファイルの詳細と、現在2つの列をどのように分割しているかについて詳しく説明していただければ、具体的な例をいくつかご紹介します。

編集:

列は2つしかなく、それぞれにコンマが含まれていないように見えるため、次のように実行できます。

  1. ファイルを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 に答える