2017-09-10 6 views
0

複数のCSVファイルを1つの列にマージする方法を教えてください。私が記録したのは、例えば、ウェブページから掻き集められた企業のチャートポジションです。最初のファイルのみが位置1〜100の2つの列と、会社の名前を含む2つ目の列を持ちます。他のすべてのファイルには1つの列しかありません。会社名のみを含む。今私はこれらを下記のようにマージしたいと思います。 Mac/Linuxソリューションが好ましいJavaScriptを少し書いてBashを書くことはできますが、Perlは私の特典ではありません。複数のCSVファイルを列ごとにマージする

1.csv

position,name 
1,microsoft 
2,apple 
3,google 

など様々なファイルを、その日にちなんで名付けられた、このように見える:

2.csv

name 
microsoft 
apple 
google 

3.csv

name 
apple 
microsoft 
google 

マージされたバージョンは、次のようになります。私は見つけることができる

position,name,name,name 
1,microsoft,microsoft,apple 
2,apple,apple,microsoft 
3,google,google,google 

唯一の解決策は、単に私が探しているものではありませんこれは、別の後にコンテンツを追加する(または連結します)。

+0

可能な複製を作成しますbashを使用して2行ずつファイルを並べ替える](https://stackoverflow.com/questions/3806874/how-to-concatenate-two-files-line-byline-using-b灰)これはあなたが探しているものではないのですか?最終的な結果はまさにあなたが探しているものです! param '-d"、 "'もちろん(https://ss64.com/bash/paste.html) – Jakumi

答えて

0

あなたが作業したい言語を実際に示していませんが、Pythonで作業したい場合は、pandasをダウンロードしてcsvをpandasテーブルに読み込むことができます。その後、テーブルはあなたがここにjqを使用したソリューションは、:)

https://pandas.pydata.org/pandas-docs/stable/merging.html

0

で求めているものを達成するために参加し使用することができます。 filter.jqは、次のフィルタが含まれている場合:

def parse: 
    reduce (inputs 
     | {f:input_filename, r:split(",")} 
     | select(.r|length>0) 
) as $i (
    {} 
    ; .[$i.f] += [$i.r] 
) 
; 

def reorg: 
    range([ map_values(length)[] ] | max) as $r 
    | [ .[] | .[$r] // [range(.[0]|length)|""] | .[] ] 
; 

parse | reorg | join(",") 

1.csv2.csv3.csvは、サンプルデータを含むファイルを、コマンド

$ jq -Rrn -f filter.jq 1.csv 2.csv 3.csv 

は、連結する[方法の

position,name,name,name 
1,microsoft,microsoft,apple 
2,apple,apple,microsoft 
3,google,google,google 
関連する問題