1

タイトルフィールドに句読点がある場合、データファイルをcsvに変換するのに苦労しています。

ファイルを取得して処理するbashスクリプトがあり、ほとんど機能します。フリーテキストのタイトルフィールドにコンマが含まれていると、余分なフィールドが作成されます。

パターン間で置き換えるためにいくつかのsedの例を試しましたが、どれも機能しませんでした。私がやりたいのは、2つのパターンの間で作業し、コンマを何もないか、おそらくセミコロンに置き換えることです。

この文字列を取る:

name:A100040,title:Oatmeal is better with raisins, dates, and sugar,current_balance:50000,

これに置き換える:

name:A100040,title:Oatmeal is better with raisins dates and sugar,current_balance:50000,

次のような状況を回避するために、変更を加えるブロックの開始と終了を示すために、おそらく「title:」と「、current_」を使用する必要があります。

name:A100040,title:Re-title current periodicals, recent books,current_balance:50000,

これまでのところ、一致する置換を取得していません。この場合、私は使用しています!! 変更を明確にするために:

teststring="name:A100040,title:Oatmeal is better with raisins, dates, and sugar,current_balance:50000,"

echo $teststring |sed '/title:/,/current_/s/,/!!/g'
name:A100040!!title:Oatmeal is better with raisins!! dates!! and sugar!!current_balance:50000!!

助けていただければ幸いです。

4

2 に答える 2

0

これは間違いなく洗練される可能性のある1つの方法です。

perl -ple 'm/(.*?)(title:.*?)(current_balance:.*)/; $save = $part = $2; $part =~ s/,/!!/g;  s/$save/$part/'
于 2012-06-18T13:33:17.533 に答える
0

まず、sedorawkを使用して CSV を解析することは、ほとんどの場合間違っています。これは、フィールド区切り文字を引用できないためです。とはいえ、出力が次のようになるように、フィールドを引用する方が良い方法のようです。

name:"A100040",title:"Oatmeal ... , dates, and sugar",current_balance:50000

あなたをsed試すことができます:(これは壊れやすいです)

sed 's/:\([^:]*\),\([^,:]*\)/:"\1",\2/g'

「標準」ツールを使用してcsvを解析しようとすることを主張し、perl標準であると考える場合は、次を試すことができます。

perl -pe '1 while s/,([^,:]*),/ $1,/g'
于 2012-06-18T13:36:38.343 に答える