特定のCSV列のすべての引用符を削除

Using SED or AWK to remove all quotes in a specific CSV column – StackOverflow

汎化性も何もあったものじゃないが.CSVなので,任意の列数で,各列がそれぞれ何かしらのファセットであれば,入力もある程度仮定できる筈なので,情報が十分にあれば正規表現が書けるだろう.今の場合,任意の定形を想定して,

import re


def reformated(strings, pat=None):
    def _f(x):
        return x.group(1) + '"' + x.group(2).replace('"', '') + '"' + x.group(3)

    if pat is None:
        pat = r'(["\d]+,["\d]+,.*?,\d+,)(.*?)(,"\d{4}-\d{2}-\d{2}.*?","\w+",)'
    return re.sub(pat, _f, strings)


strings = """"123","456",,17,"hello," how are you this, fine, highly caffienated morning,","2018-05-29T18:58:10-05:00","XYZ", 
"345","737",,16,"Heading to a "meeting", unprepared while trying to be "awake","2018-05-29T18:58:10-05:00","ACD","""

print(reformated(strings))
"123","456",,17,"hello, how are you this, fine, highly caffienated morning,","2018-05-29T18:58:10-05:00","XYZ", 
"345","737",,16,"Heading to a meeting, unprepared while trying to be awake","2018-05-29T18:58:10-05:00","ACD",

さて,これは多分SEDでは難しいが,Awkだとまあそれ程難しくはない.どちらにしても,どの様に仮定を置くかが問われるが.文字列部分の扱いが不安定で,前後についてはセル数が決まっていると仮定すれば,

%%bash
time {
awk -F',' '{s=index($0,$5);e=index($0,$(NF-2))-1;a=substr($0, s, e-s);gsub(/"/, "", a);print substr($0,0,s)"\""a"\""substr($0,e)}' file
}
"123","456",,17,"hello, how are you this, fine, highly caffienated morning,","2018-05-29T18:58:10-05:00","XYZ", 
"345","737",,16,"Heading to a meeting, unprepared while trying to be awake","2018-05-29T18:58:10-05:00","ACD",

real    0m0.003s
user    0m0.001s
sys 0m0.002s
カテゴリー: 未分類 パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください