csvを取得してtsvに変換

Remove quotes “…” from all columns with AWK – StackOverflow

タイトルも本文も期待される出力もチグハグなので,勝手に考えてみると.まず,期待される出力はおかしいので,優秀なCSVパーサを積んでいるPandasの結果が期待される出力と考える.

import pandas as pd


df = pd.read_csv('file', dtype=str)
print(df.fillna('null').to_csv(sep='\t', index=False))
visitor_date    country browser browser_version id1 id2 id3 id4 true or false column
05/10/2019 00:55    United States   App null    692467  2163702 4117512086  format  0
05/10/2019 00:56    United States   SamsungBrowser  8   692467  2163702 4117512083  format  1
05/10/2019 01:08    United States   safari  11  692467  2163704 4117511299  format  1
05/10/2019 03:25    United States   SamsungBrowser  8   692467  2163704 4117511299  format  null
05/10/2019 07:50    United States   chrome  58  692467  2163704 4117511299  format  null
05/10/2019 09:18    United States   internet explorer   11  692467  2163702 4117512086  format  0

これと同じ事をAwkで考えると,

%%bash
time {
awk 'BEGIN{FS=",";OFS="\t"}{gsub(/""/, "null");gsub(/"/, "");$1=$1}1' file
}
visitor_date    country browser browser_version id1 id2 id3 id4 true or false column
05/10/2019 00:55    United States   App null    692467  2163702 4117512086  format  0
05/10/2019 00:56    United States   SamsungBrowser  8   692467  2163702 4117512083  format  1
05/10/2019 01:08    United States   safari  11  692467  2163704 4117511299  format  1
05/10/2019 03:25    United States   SamsungBrowser  8   692467  2163704 4117511299  format  null
05/10/2019 07:50    United States   chrome  58  692467  2163704 4117511299  format  null
05/10/2019 09:18    United States   internet explorer   11  692467  2163702 4117512086  format  0

real    0m0.003s
user    0m0.002s
sys 0m0.001s

コメントにある様なケース(CSVの定義として,カンマ区切りのフィールドで,フィールド内にカンマがある場合二重引用符で囲む)の場合,

import io
import pandas as pd


strings = """A,,C,"D,E,F","G",I,"K,L,M",Z"""
df = pd.read_csv(io.StringIO(strings), header=None)
df
    0   1   2   3   4   5   6   7
0   A   NaN C   D,E,F   G   I   K,L,M   Z

mawkでは一から考えないといけないが,gawkの場合はFPAT変数が用意されている.

4.7 Defining Fields by Content – The GNU Awk User’s Guide

CSVの様な定形的データの場合,trやsedで処理するのは(余程安易な(強い仮定を置ける)ケースでない限り)リーズナブルでは無い.構造を無視して,テキストとして処理してしまうより,決まった構造に沿って処理するべきなので,だからこそコメントにある様に,CSVパーサなり,gawkなりを用いるべき.

%%writefile test.py
#!/usr/bin/env python
import sys
import csv


reader = csv.reader(sys.stdin)
writer = csv.writer(sys.stdout, 'excel-tab')
writer.writerows(reader)
%%writefile test2.py
#!/usr/bin/env python
import sys
import csv


with open(sys.argv[1], 'r') as csvfile:
    reader = list(csv.reader(csvfile))

with open('out.tsv', 'w') as csvfile:
    writer = csv.writer(csvfile, 'excel-tab')
    writer.writerows(reader)
%%bash
time {
cat file | python test.py
}
visitor_date    country browser browser_version id1 id2 id3 id4 true or false column
05/10/2019 00:55    United States   App     692467  2163702 4117512086  format  0
05/10/2019 00:56    United States   SamsungBrowser  8   692467  2163702 4117512083  format  1
05/10/2019 01:08    United States   safari  11  692467  2163704 4117511299  format  1
05/10/2019 03:25    United States   SamsungBrowser  8   692467  2163704 4117511299  format  
05/10/2019 07:50    United States   chrome  58  692467  2163704 4117511299  format  
05/10/2019 09:18    United States   internet explorer   11  692467  2163702 4117512086  format  0

real    0m0.059s
user    0m0.042s
sys 0m0.021s
カテゴリー: 未分類 パーマリンク

コメントを残す

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

WordPress.com ロゴ

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

Google フォト

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

Twitter 画像

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

Facebook の写真

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

%s と連携中

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