11420


読み込んだCSVファイルから、nullをスペースに置き換えて出力したいです。

nullは,,のところです。  
1レコード17項目です。

読み込みファイル  
01,,01,4ｶﾅ-0001,５漢字－０００１,６,７年月-0001,８日付-0001,９－０００１,１０ー０００１,１１ー０００１,１２ー０００１,3,4,１５ー０００１,6,17000001  
02,0002,,4ｶﾅ-0002,５漢字－０００2,６,７年月-0002,８日付-0002,９－０００2ｅ,１０ー０００２,１１ー０００２,１２ー０００２,3,4,１５ー０００２,6,17000002

出力  
＊△は半角スペース  
01,△△△△,01,4ｶﾅ-0001,５漢字－０００１,６,７年月-0001,８日付-0001,９－０００１,１０ー０００１,１１ー０００１,１２ー０００１,3,4,１５ー０００１,6,17000001  
02,0002,△△,4ｶﾅ-0002,５漢字－０００２,６,７年月-0002,８日付-0002,９内容－０００2,１０ー０００２,１１ー０００２,１２ー０００２,3,4,１５ー０００２,6,17000002

[code]

            open IN2, "<:encoding(utf8)", "$input_FILE" or die;
            open OUT2, ">:encoding(utf8)", "$output_FILE" or die;
    
            while ( my $line2 = <IN2>) {
                # 改行を削除
                chomp $line2;
    
                # レコード前後の""を外す
                $line2 =~ s/^"//;
                $line2 =~ s/"$//;
    
                # 1レコード項目ごとに分割
                my @data2 = split(/,/, $line2);
    
                # レコードにnullが含まれている？
                if ( $line2 =~ undef ) {
                    $line2 =~ s/$line2/ /g;
                    print "nullがあったよ!\n";
                } else {
                    print "nullないよ！\n";
                }
    
                print OUT2 join (",", @data2),"\n";
    
            }
            close IN2;
            close OUT2;
    
[/code]

undefのところを\0にしても反応がありませんでしたが、undefは反応し、ディスプレイに表示もされましたが、出力ファイルにスペースが出力されておらず、判定のみで置き換えができていませんでした。よろしくお願いします。


CC BY-SA 3.0
2015-06-16T09:17:33.567
11410
2015-06-17T10:47:28.380
9693
question
perl
null文字判定と置き換え


@data2 は置き換え処理をする前の $line2 から作られているように見えます。順序をすこし変えてみてはいかがでしょうか。


CC BY-SA 3.0
2015-06-16T09:33:36.167
11411
2015-06-16T09:33:36.167
3054
11410
answer


`$line2`を調べて置き換えを行っても出力は`@data2`を`join`したものですから意味がありません。  
`split`した内容を調べて置き換えをする必要があると思います。  
例えば、以下の様にします。

[code]

    my @data2 = split(/,/, $line2);
    foreach my $item (@data2){
        if($item eq ""){
            $item = "  ";
        }
    }
    
[/code]


CC BY-SA 3.0
2015-06-16T09:37:51.023
11412
2015-06-16T10:16:24.623
2015-06-16T10:16:24.623
5044
5044
11410
answer


試していませんが、split & join せずとも置換2回で事足りませんか。  
`s/,,/, ,/g` で置換できないパターンは、`,,,`
の2つ目のカンマのようにnullの次でありかつ別のnullの前であるカンマの場合ですので、2回置換で取りこぼしが無くなります。

[code]

    # レコードにnullが含まれている？
    if ( $line2 =~ /,,/ ) {
        print "nullがあったよ!\n";
    } else {
        print "nullないよ！\n";
    }
    # nullを半角スペース化
    $line2 =~ s/,,/,  ,/g;
    $line2 =~ s/,,/,  ,/g;
    
[/code]


CC BY-SA 3.0
2015-06-16T12:05:58.070
11417
2015-06-16T12:05:58.070
8431
11410
answer


Perlでnull文字は`\0`か`\x00`を使います。

[code]

    open IN2, "<:encoding(utf8)", "$input_FILE" or die;
    open OUT2, ">:encoding(utf8)", "$output_FILE" or die;
    
    while (my $line2 = <IN2>) {
        # null文字列が存在する？
        if ($line2 =~ s/\x00/ /g) {
            print "nullがあったよ\n";
        } else {
            print "nullがないよ\n";
        }
        print OUT2 $line2;
    }
    
    close IN2;
    close OUT2;
    
[/code]

慣れないうちは`use warnings`を付ける事をおすすめします。  
今回の場合、特に`$line2 =~ undef`の部分について、有用な警告を表示してくれます。

* * *

### null文字:

制御文字のひとつで、C言語等においては文字列の終端を表します。文字ですので特定のプログラミング言語によらずCSVの中に紛れる（もしくは意図して挿入する）事があります。

### 空文字列:

文字がひとつも含まれない文字列を空文字列と言います。制御文字も含みません。

### undef:

Perlでundefは関数のひとつです。未定義値を返します。定義されていませんので、空文字列ではありません。


CC BY-SA 3.0
2015-06-16T17:32:41.707
11420
2015-06-17T10:47:28.380
2015-06-17T10:47:28.380
62
62
11410
answer