Dường như dữ liệu của bạn trong một định dạng "text-bàn".
Tôi khuyên bạn nên sử dụng hàng đầu tiên để tìm ra điểm bắt đầu và độ dài của mỗi cột (bằng tay hoặc viết kịch bản với regex để xác định các cột có khả năng), sau đó viết kịch bản để lặp lại các hàng của tệp, cắt hàng thành các đoạn cột và áp dụng dải cho từng phân đoạn.
Nếu bạn sử dụng regex, bạn phải theo dõi số lượng cột và báo lỗi nếu có hàng nhất định nhiều hơn số cột dự kiến (hoặc số khác với số cột còn lại). Việc chia tách trên hai hoặc nhiều không gian sẽ phá vỡ nếu giá trị của một cột có hai hoặc nhiều khoảng trống, không chỉ hoàn toàn có thể, mà còn có khả năng. Các bảng văn bản như thế này không được thiết kế để tách ra trên một regex, chúng được thiết kế để chia thành các vị trí chỉ mục cột.
Về mặt lưu dữ liệu, bạn có thể sử dụng mô-đun csv để ghi/đọc vào tệp csv. Điều đó sẽ cho phép bạn xử lý trích dẫn và thoát các ký tự tốt hơn so với chỉ định dấu phân cách. Nếu một trong các cột của bạn có ký tự |
làm giá trị, trừ khi bạn mã hóa dữ liệu bằng chiến lược xử lý các lần thoát hoặc các chữ được trích dẫn, đầu ra của bạn sẽ bị ngắt khi đọc.
Phân tích văn bản trên sẽ giống như thế này (i lồng một hiểu danh sách với dấu ngoặc thay vì định dạng truyền thống vì vậy nó dễ dàng hơn để hiểu):
cols = ((0,34),
(34, 50),
(50, 59),
(59, None),
)
for line in lines:
cleaned = [i.strip() for i in [line[s:e] for (s, e) in cols]]
print cleaned
sau đó bạn có thể viết nó với một cái gì đó như:
import csv
with open('output.csv', 'wb') as csvfile:
spamwriter = csv.writer(csvfile, delimiter='|',
quotechar='"', quoting=csv.QUOTE_MINIMAL)
for line in lines:
spamwriter.writerow([line[col_start:col_end].strip()
for (col_start, col_end) in cols
])
Luôn có nhiều khoảng trống giữa các cột dữ liệu? –
@ cricket_007 yep, luôn có nhiều hơn một không gian – aysha
Bạn không nên sử dụng regex, vì dữ liệu có thể có 2 hoặc nhiều khoảng trống trong một cột. Dữ liệu ở định dạng bảng văn bản, cột sp phải được xác định bởi vị trí của một ký tự trên mỗi dòng. –