2011-07-21 3 views
0
   use strict; 
      use warnings; 
      open(FILE4,"cool.txt"); 
      open(FILE6,">./mool.txt"); 
      $line = <FILE4>; 
       while ($line ne "") 
      { 
       @array = split(/,/,$line); 
       $line = <FILE4> ; 
       print FILE6 ($array[0]); 
       print FILE6 ("\t"); 
       print FILE6 ($array[1]); 
       print FILE6 ("\t"); 
       print FILE6 ($array[2]); 
      } 

これは私がperlで書いたコードです。しかし、コードは正常に動作していません。すべての次の行のタブスペースを与えます。しかし、私は、すべての新しい行のためのそのTABスペースが必要ない。私は出力がどのようにあなたを示すことができます。誰でもバグがどこにあるのか教えていただけますか?

  name   contact  email 
         samy   32344245   [email protected] 
         alex   231414124   [email protected] 

これはis.Can私はタブspace.Iがどこバグを見つけるためにしようとしています直面していnextlineから私のmool.txt file.The最初の行にその作業fine.Butを参照してどのように誰でもしてくださいです誰かがあなたに

 "name","contact","email" 
     "samy","32344245","[email protected]" 
+0

を私たちに最初の二つを示してください。あなたの入力ファイルの行 –

+3

データが複雑になると問題に遭遇するかもしれません。たとえば、名前や連絡先フィールドでコンマを処理するにはどうすればよいですか? [Text :: CSVなど](http://search.cpan.org/search?query=text%3A%3Acsv&mode=all)などのCSVモジュールを調べることをお勧めします。 – Mike

+0

そのファイルにはデータの前にタブ文字*がありますか? :) –

答えて

2

は、whileループ内でこの文を入れてください。 chomp これは、ファイルから行を読み込んだ後の最初の行にする必要があります。これにより、不要なスペースが削除されます。

use strict; 
use warnings; 
open(FILE4,"cool.txt"); 
open(FILE6,">./mool.txt"); 

while (<FILE4>) 
{ 
    chomp; #This will remove unwanted spaces 
    @array = split(/,/,$_); #$_ will represent the line which is read 
    print FILE6 ($array[0]); 
    print FILE6 ("\t"); 
    print FILE6 ($array[1]); 
    print FILE6 ("\t"); 
    print FILE6 ($array[2]); 
    print FILE6 ("\n"); 
} 
+1

'$ /'を更新しない限り、 'chomp'は文字列から末尾のタブを削除しません。 –

+0

@eugeneこのコードスニペットを確認し、出力 '#!/ usr/bin/perl $ x = ; print "chompなし:| $ x |"; chomp($ x); 印刷 "\ nAfterムシャムシャ食べる:| $ xに|"; ' 出力 ' [tethomas @〜/ perlのトレーニング] ./ t.pl こんにちは ムシャムシャ食べるなし:|こんにちは | chomp:| Hello | ' – cppcoder

+0

@cpp eugeneは正しいです:[perldoc perlfunc](http://perldoc.perl.org/functions/chomp.html)'この安全なバージョンのチョップは、 $ /の現在の値($ INPUT_RECORD_SEPARATOR ...とも呼ばれます) ' – TLP

4

を入力ファイルを示すイムを尋ねたとして、あなたはおそらく持っているあなたに

をout.Thank私はそれを何度も行ってますが、それを把握することができませんでしたか。コードが間違っている場合私に知らせて入力ファイル内の行の先頭/末尾の空白。
s///とそれをリッピングしてみてください。

use strict; 
use warnings; 

open my $in, "<", "cool.txt" or die $!; 
open my $out, ">", "mool.txt" or die $!; 

while (my $line = <$in>) { 
    $line =~ s/^\s+|\s+$//g;      
    my @array = split(/,/, $line); 
    print $out join("\t", @array), "\n"; 
}  
+0

3つの引数のオープンを使用してください。ところで、なぜここでも構文の強調表示が失敗しますか? – Svante

+0

「open」という3つの引数を持つ形式のほうが2番目です。また、ファイルを開くことからの戻り値を常にチェックする必要があります。 –

2

このファイルをカンマ区切りからタブ区切りに変更しているようです。もしそうなら、これはそれを行うための簡単な方法かもしれません:

while (<>) { 
    s/,/\t/g; 
    print; 
} 

をし、このようにそれを使用します。

$ script.pl cool.txt > mool.txt 

あなたも離れてワンライナーで受け取ることがあります。

perl -pwe 's/,/\t/g' cool.txt > mool.txt 

それとも、変な空白がある場合:

perl -pwe 's/^\s+|\s+$//g; s/,/\t/g' cool.txt > mool.txt 
を0

またはより安全なバージョンText::CSVを使用してください。これにより、複雑なデータなどが処理されます。空白の出力が得られた場合、余分な空白が混乱する可能性があります。

perl -pwe 's/^\s+|\s+$//g;' cool.txt > cool_clean.txt 

スクリプト:もしそうなら、あなたは、入力ファイルの「クリーンアップ」バージョンを取得するためにs/,/\t/g行することなく、上記のワンライナーを実行することができます

use warnings; 
use strict; 
use Text::CSV; 
use autodie; 

my $csv_in = Text::CSV->new(); 
my $csv_out = Text::CSV->new({ sep_char => "\t", eol => "\n" }); 
open my $fh, '<', 'data.csv'; 
open my $out, '>', 'mool.txt'; 
while (my $row = $csv_in->getline($fh)) { 
    $csv_out->print($out, $row); 
} 
関連する問題