2015-10-07 28 views
13

同じ列であるが、順序が違うcsvファイルがたくさんある。 SQL * Plusを使用してそれらをアップロードしようとしていますが、列が固定された列が必要です。Python - csvで列を並べ替える

必要順序:B C D E F

CSVファイル:C D E Bは、(それが利用できないため、時には列がCSVではない)

パイソンと、それが達成可能ですか?私たちはそれを行うためにAccess + Macrosを使用しています...しかし、それは時間がかかりすぎます

PS。申し訳ありませんが誰かが私の英語力のために動揺した場合。

+0

はいです。正規表現のパターンを使用して、離れて行く。 – ergonaut

答えて

14

あなたは、読んで並べ替え、その後、あなたのファイルを書き込むcsv moduleを使用することができます。ファイルfoo.csv考える

for row in csv.DictReader(open("foo.csv")): 
    print row["b"], row["a"] 

2 1 
22 21 

サンプルファイル:THIに取り組む

$ cat file.csv 
A,B,C,D,E 
a1,b1,c1,d1,e1 
a2,b2,c2,d2,e2 

コード

import csv 

with open('file.csv', 'r') as infile, open('reordered.csv', 'a') as outfile: 
    # output dict needs a list for new column ordering 
    fieldnames = ['A', 'C', 'D', 'E', 'B'] 
    writer = csv.DictWriter(outfile, fieldnames=fieldnames) 
    # reorder the header first 
    writer.writeheader() 
    for row in csv.DictReader(infile): 
     # writes the reordered rows to the new file 
     writer.writerow(row) 

出力

$ cat reordered.csv 
A,C,D,E,B 
a1,c1,d1,e1,b1 
a2,c2,d2,e2,b2 
+1

'DictReader' /' DictWriter'を本当にうまく利用しています。 –

1
csv_in = open("<filename>.csv", "r") 
csv_out = open("<filename>.csv", "w") 

for line in csv_in: 
    field_list = line.split(',') # split the line at commas 
    output_line = ','.join(field_list[0], # rejoin with commas, new order 
          field_list[2], 
          field_list[3], 
          field_list[4], 
          field_list[1] 
          ) 
    csv_out.write(output_line) 

csv_in.close() 
csv_out.close() 
+1

カンマを含む引用符付きの文字列がある場合はどうなりますか? –

1

thisと同様のものを使用して、 ';'を置き換えることができます。あなたの場合、 '、'と一緒に。 あなたは複数の.csvファイルを行うために必要とするので、あなたのファイルのリスト

for file_name in glob.glob('<Insert-your-file-filter-here>*.csv'): 
    #Do the work here 
1

ためのglobモジュールを使用することができcsvモジュールは、あなたはそれらの列名に関連するそれらの値でCSVファイルを読み込むことができます。これにより、明示的にリストを並べ替えることなく、列を任意に並べ替えることができます。

a,b,d,e,f 
1,2,3,4,5 
21,22,23,24,25 
4

だから、一つの方法問題は、pipを使って簡単にインストールできるpandasライブラリを使用することです。基本的には、csvファイルをpandasデータフレームにダウンロードしてから、列を並べ替えてcsvファイルに保存し直すことができます。たとえば、あなたのsample.csvは以下のように見える場合:

A,C,B,E,D                             
a1,b1,c1,d1,e1                           
a2,b2,c2,d2,e2 

ここでは問題を解決するためのスニペットです。

import pandas as pd 
df = pd.read_csv('/path/to/sample.csv') 
df_reorder = df[['A', 'B', 'C', 'D', 'E']] # rearrange column here 
df_reorder.to_csv('/path/to/sample_reorder.csv', index=False) 
+0

ありがとう、私の人生を救った – code4j