0,2,0,こんにちは,50,0,0,0,0,0 1,1,1,さようなら,0,0,0,0,0,0
理想: 1,1,0,"ああ,いい,ううう。",21,0,0,0,0,0 0,2,0,"あれれれ,",50,0,0,0,0,0 現実: 1,1,0,ああ,いい,ううう。,21,0,0,0,0,0 0,2,0,あれれれ,,50,0,0,0,0,0
1,1,0,ああ,いい,ううう。,21,0,0,0,0,0 ↓ カンマで分割してリストにする 1 1 0 ああ いい ううう。 21 0 0 0 0 0 ↓ 前と後ろのカラムを取る [1 1 0] ああ いい ううう。 [21 0 0 0 0 0] ↓ ああ いい ううう。 ↓ 残りをカンマで繋ぎ直し、ダブルクォートで囲む "ああ,いい,ううう。" ↓ さっき取った、前と後ろのカラムと合わせて最終的な CSV にする 1,1,0,"ああ,いい,ううう。",21,0,0,0,0,0
my $IX = 4; # 4番目のカラムがカンマ入りテキスト my $N = 10; # 全部で10カラム while (<>) { chomp; # 末尾の改行削除 my @F = split(",", $_, -1); # 読み込んだ CSV 行をカンマで切ってリストへ my @pre = @F[0..($IX-2)]; # 前から IX-1 個分のカラム my @post = @F[$#F-($N-$IX-1)..$#F]; # 後ろから N-IX 個分のカラム my $text = join(",", @F[($IX-1)..($#F-($N-$IX))]); # カンマ入りテキスト print join(",", @pre, "\"$text\"", @post)."\n"; # CSV に戻す }
my $IX = 4; # 4番目のカラムがカンマ入りテキスト my $N = 4; # 全部で10カラム while (<>) { chomp; # 末尾の改行削除 my @F = split(",", $_, -1); # 読み込んだ CSV 行をカンマで切ってリストへ my @ts = join(",", splice(@F, $IX-1, (@F-$N) + 1)); # テキスト部分の抜き出し splice(@F, $IX-1, 0, qq(").join(",", @ts).qq(")); # ""をつけて戻す print join(",", @F)."\n"; # CSV に戻す }
ID = 4 N = 10 with open('sample.csv') as f: for line in f.read().splitlines(): pre = line.split(",", ID - 1) post = pre[-1].rsplit(",", N - ID) l = pre[:-1] l.append('"' + post[0] + '"') l.extend(post[1:]) print(",".join(l))
1,1,0,ああ,いい,ううう。,21,0,0,0,0,0 ↓ 最初の split で前から4分割(3箇所で切断) 1 / 1 / 0 / ああ,いい,ううう。,21,0,0,0,0,0 ↓ 一番右の塊を次の rsplit で後ろから7分割(6箇所で切断)。 ああ,いい,ううう。 / 21 / 0 / 0 / 0 / 0 / 0 ↓ 1 / 1 / 0 / ああ,いい,ううう。 / 21 / 0 / 0 / 0 / 0 / 0 ↓ 1,1,0,"ああ,いい,ううう。",21,0,0,0,0,0