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