(オリジナルポスト)
「CSVのデータを比較について【行の追加と空白】」 < スタック・オーバーフロー
winmergeの入力データ
csvデータ①
A,B,C,
1,アメリカ,○,
,カナダ,×,
3,日本,×,
,イタリア,〇,
5,イギリス,□,
,,×,
csvデータ②
A,B,C,
1,アメリカ,×,
2,カナダ,○,
3,日本,○,
4,タイ,○,
10,ベトナム,○,
,イタリア,〇,
5,イギリス,□,
,,×,
7,,〇,
8,,×,
,ミャンマ,□,
winmergeの実行方法と結果
winmerge>表示(V)>Diffコンテキスト(D)>0行
1,アメリカ,○, 1,アメリカ,×,
,カナダ,×, 2,カナダ,○,
3,日本,×, 3,日本,○,
4,タイ,○,
10,ベトナム,○,
7,,〇,
8,,×,
,ミャンマ,□,
online awkの実行方法と結果
Command line (--help):
'BEGIN{FS=",";OFS=","} {gsub(/ /,"")}NF==4{print $1,$2,$3 "→追加された行★★★" }NF==7{print $4 ,$5 ,$6 " →" "\"" $3 "\"" "→" "\"" $6 "\"" "★★★" }'
STDIN:
1,アメリカ,○, 1,アメリカ,×,
,カナダ,×, 2,カナダ,○,
3,日本,×, 3,日本,○,
4,タイ,○,
10,ベトナム,○,
7,,〇,
8,,×,
,ミャンマ,□,
STDOUT | STDERR:
1,アメリカ,× →"○"→"×"★★★
2,カナダ,○ →"×"→"○"★★★
3,日本,○ →"×"→"○"★★★
4,タイ,○→追加された行★★★
10,ベトナム,○→追加された行★★★
7,,〇→追加された行★★★
8,,×→追加された行★★★
,ミャンマ,□→追加された行★★★
最終保存2021/02/27
ついでにwinmergeで、コードと回答を比較してみた。
winmergeの画像では、ありません。テキストの左右配置です。右にスクロールが必要です。
コード 1 件の回答
import csv import csv
import pandas as pd import pandas as pd
#差分抽出方法のコード #差分抽出方法のコード
#ファイルの読み込み #ファイルの読み込み
df1 = pd.read_csv("test1.csv",encoding='utf_8_sig') df1 = pd.read_csv("test1.csv", dtype=str, na_filter=False, encoding='utf_8_sig')
df2 = pd.read_csv("test2.csv",encoding='utf_8_sig') df2 = pd.read_csv("test2.csv", dtype=str, na_filter=False, encoding='utf_8_sig')
#ファイルの比較 # tuple に変換してから差分を取得
df3 = pd.concat([df1.iloc[df1.compare(df2[:len(df1)]).index],df2[len(df1):]]) df3 = df2[~df2.apply(tuple, 1).isin(df1.apply(tuple, 1))]
#特定の文字を検索 #特定の文字を検索
df_h = df3[df3["C"].str.contains("○|×|□",na=False)].reset_index(drop=True) df_h = df3[df3["C"].str.contains("○|×|□")].reset_index(drop=True)
pd.set_option('display.unicode.east_asian_width', True)
#ファイル書き込み #ファイル書き込み
df_h.to_csv("test.csv",encoding='utf_8_sig',index=False) df_h.to_csv("test.csv", encoding='utf_8_sig', index=False)
pd.set_option('display.unicode.east_asian_width', True)
print(df_h)