2015-10-07 21 views
13

Tôi có một nhóm tệp csv có cùng các cột nhưng theo thứ tự khác nhau. Chúng tôi đang cố gắng tải chúng lên bằng SQL * Plus nhưng chúng tôi cần các cột có cột cố định sắp xếp.Python - sắp xếp lại các cột trong một csv

Ví dụ

cần theo thứ tự: A B C D E F tập tin

csv: A C D E B (đôi khi một cột không nằm trong csv bởi vì nó không có sẵn)

là nó có thể đạt được với python? chúng tôi đang sử dụng Access + Macros để thực hiện ... nhưng quá tốn thời gian

PS. Xin lỗi nếu có ai buồn vì kỹ năng tiếng Anh của tôi.

+0

Vâng. Sử dụng một mô hình regex và đi bạn đi. – ergonaut

Trả lời

14

Bạn có thể sử dụng csv module để đọc, sắp xếp lại, và sau đó và viết tập tin của bạn.

Sample File:

$ 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) 

đầu ra

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

Sử dụng thực sự tốt đẹp của '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

Điều gì sẽ xảy ra nếu có các chuỗi được trích dẫn có chứa dấu phẩy? –

1

Bạn có thể sử dụng thứ gì đó tương tự như this để thay đổi thứ tự, thay thế ';' với ',' trong trường hợp của bạn. Bởi vì bạn nói bạn cần phải làm nhiều file .csv, bạn có thể sử dụng các mô-đun glob cho một danh sách các tập tin của bạn

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

Module csv cho phép bạn đọc các file csv với các giá trị của mình gắn liền với tên cột của họ. Điều này lần lượt cho phép bạn tùy ý sắp xếp lại các cột, mà không cần phải niêm yết rõ ràng.

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

2 1 
22 21 

Với file foo.csv:

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

Vì vậy, một trong những cách để giải quyết thi Vấn đề là sử dụng thư viện pandas có thể dễ dàng cài đặt bằng cách sử dụng pip. Về cơ bản, bạn có thể tải xuống tệp csv vào khung dữ liệu gấu trúc rồi đặt lại cột và lưu lại thành tệp csv. Ví dụ: nếu số sample.csv của bạn trông giống như bên dưới:

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

Đây là một đoạn mã để giải quyết vấn đề.

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

cảm ơn, đã cứu mạng tôi – code4j

Các vấn đề liên quan