次のようなカンマ区切りのファイルがあるとします。
フー、バー、ン 、あいうえお 一二三 、あいうえお
そして、私はこれを生成するために参加したい\n,
:
フー、バー、n、a、bc、d 1、2、3、a、bc、d
正規表現のトリックは何ですか? if (/\n,/)
これなら釣れると思った。
また、UTF-8 でエンコードされたファイルに対して何か特別なことをする必要がありますか?
最後に、Groovy でのソリューションも役立ちます。
これを自分で行う代わりに、 Text::CSV_XSを使用する必要があります。Unicode ファイルだけでなく、レコードに埋め込まれた改行もサポートしています。パーサーを作成するときに正しいオプションを指定する必要があるため、ドキュメントを注意深く読んでください。
これがGroovyバージョンです。要件によっては、これがキャッチできないニュアンスがいくつかあります(コンマを含めることができる引用符で囲まれた文字列など)。また、改行が常に最後ではなくフィールドの中央で発生する可能性がある場合は、微調整する必要があります。
def input = """foo,bar,n
,a,bc,d
one,two,three
,a,bc,d"""
def answer = (input =~ /(.*\n?,){5}.*(\n|$)/).inject ("") { ans, match ->
ans << match.replaceAll("\n","") << "\n"
}
assert answer.toString() ==
"""foo,bar,n,a,bc,d
one,two,three,a,bc,d
"""
これは主に、UTF-8 エンコーディングに関する質問への回答です。
特定のエンコーディングによっては、null バイトを探す必要がある場合もあります。上記のアドバイスがうまくいかない場合は、's/\n,/,/g' を 's/\c@?\n(\c@?,)/$1/g' に置き換えると、エンコーディングを壊さずにうまくいくかもしれませんただし、繰り返し実行する方が安全かもしれません (連結してグローバルに適用するのではなく、各行に 's/\c@?\n(\c@?,)/$1/' を適用します)。これは実際にはハックであり、実際の Unicode サポートの代わりになるものではありませんが、簡単な修正が必要な場合、またはエンコーディングに関する保証がある場合は、役立つ可能性があります。
これは私のために働く:
open(F, "test.txt") or die;
undef $/;
$s = <F>;
close(F);
$s =~ s/\n,/,/g;
print $s;
$ cat test.txt
foo,bar,n
,a,bc,d
one,two,three
,a,bc,d
$ perl test.pl
foo,bar,n,a,bc,d
one,two,three,a,bc,d
これは単純すぎるかもしれません (または、一般的なケースを十分に処理できません)。
def input = """foo,bar,n
,a,bc,d
one,two,three
,a,bc,d"""
def last
input.eachLine {
if(it.startsWith(',')) {
last += it;
return;
}
if(last)
println last;
last = it
}
println last
発する;
foo,bar,n,a,bc,d
one,two,three,a,bc,d