2012-02-10 39 views
8

Tôi có một tệp CSV mà tôi muốn phân tích - vấn đề là một nửa số dấu ngoặc kép được sử dụng làm dấu ngoặc kép và dấu phẩy bên trong trường chính. Chúng không thực sự là CSV, nhưng chúng có một số trường cố định có thể nhận dạng được. Các phương ngữ = csv. "Vượt trội" thiết lập hoạt động hoàn hảo trên các tập tin với phần thêm "và ký tự bên trong lĩnh vực này.Tệp CSV có dấu ngoặc kép và dấu phẩy bên trong các trường

Những thông tin này là cũ/không được hỗ trợ. Tôi cố gắng để đẩy một số cuộc sống vào nó.

ví dụ

"AAAAA 
AAAA 
AAAA 
AAAA","AAAAAAAA 


AAAAAA 
AAAAA "AAAAAA" AAAAAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAA, AAAAA 
AAAAAAAAA AAAAA AAAAAAAAAA 
AAAAA, "AAAAA", AAAAAAAAA 
AAAAAAAA AAAAAAAA 
AAAAAAA 
" 

này được vấp ngã phân tích cú pháp tập tin, và ném một lỗi _csv.Error: newline inside string. tôi narrrowed nó xuống đến vấn đề này là bằng cách loại bỏ các dấu ngoặc kép từ bên trong lĩnh vực thứ 2 và các mô-đun csv.reader phân tích các tập tin OK .

Một số các trường là nhiều dòng - Tôi không chắc liệu điều đó có quan trọng không.

Tôi đã poking xung quanh tại các thiết lập phương ngữ, và trong khi tôi có thể tìm thấy 'skipinitialspace', điều này dường như không giải quyết được vấn đề.

Để được rõ ràng -. Đây là không hợp lệ 'CSV', các đối tượng dữ liệu của nó mà lỏng lẻo theo một cấu trúc CSV, nhưng có, và "ký tự bên trong kiểm tra lĩnh vực

Các lineterminator là \ x0d \ x0a

Tôi đã thử một số lần theo các phép tính khác nhau của doublequote và biến trích dẫn trong mô-đun phương ngữ, nhưng tôi không thể lấy phân tích cú pháp này một cách chính xác. chỉ tồn tại trên các ranh giới của trường.

Vấn đề này chỉ tồn tại cho một (cuối cùng) của một số trường trong tệp và có hàng nghìn tệp.

+3

CSV phù hợp sử dụng hai ký tự trích dẫn liên tiếp ('" "') để thoát khỏi ký tự trích dẫn trong trường được trích dẫn. Ngoài ra, trường có thể không được bỏ phiếu và không có lối thoát nào là cần thiết, mặc dù dấu phẩy và dòng mới không thể xuất hiện trong một trường như vậy. Dấu nháy đơn như thế này thường không hợp lệ. Có thể sửa đổi các tùy chọn của nguồn dữ liệu CSV của bạn để phù hợp hơn với sự mong đợi của hầu hết các trình đọc CSV khác (kể cả python) hay không. – SingleNegationElimination

+1

Tôi đã kế thừa dữ liệu - và có rất nhiều dữ liệu ... Vì vậy, tôi không thể làm bất kỳ điều gì ngoại trừ việc tạo một trình phân tích cú pháp có thể chọn lại nó. –

+0

Các tệp không bị hỏng, cấu trúc kém/kém được cấu trúc dưới dạng CSV."Tôi thừa hưởng dữ liệu" là chính xác 'lý do' - đó chỉ là những gì sẽ xảy ra. Dữ liệu cũ/bị bỏ rơi và tôi muốn hồi sinh lại. –

Trả lời

3

Tôi không được phép bình luận khá được nêu ra, vì vậy tôi sẽ đăng như một câu trả lời ...

Giả sử bạn đang sử dụng dấu phẩy như delimiter của bạn, được có bất kỳ dấu phẩy trong dữ liệu của bạn? Nếu không, sau đó bạn có thể thực hiện tìm kiếm lớn và thay thế để nhân đôi tất cả các ký tự trích dẫn sau ký tự đầu tiên và trước ký tự cuối cùng của trường trước khi xử lý CSV.

+0

Đáng buồn là có dấu phẩy trong văn bản trường, nhưng tôi nghĩ tôi sẽ phải xóa mô-đun csv để phân tích cú pháp - Tôi không thể tin tưởng rằng tôi sẽ không tìm thấy kết hợp "hoặc" trong văn bản trường , loại hình nào khiến cho toàn bộ ý tưởng của csv ... –

+0

Vâng, đó là một ý nghĩ. Trong một trường dữ liệu nhất định cho một cơ sở dữ liệu ở đây tại nơi làm việc của tôi, tôi đã cấm sử dụng dấu phẩy. Mặc dù vậy, tôi đã có thể thoát khỏi nó, chỉ vì chỉ có 100 hồ sơ bị ảnh hưởng trong một tệp hàng 50.000. – Herbie

+0

Đó là một ý tưởng hay, nhưng tôi có vài nghìn tệp, mỗi tệp có nhiều thứ chưa biết - chờ đợi - tôi có thể làm theo cách đó - tôi biết gần đúng nơi "ký tự" trong tệp - tôi có thể tìm thấy chúng, thay thế chúng –

11

Bạn đã thử vượt qua csv.QUOTE_NONE qua từ khóa quoting arg? Nếu không có một số mã hoặc dữ liệu để kiểm tra điều này, tôi không có cách nào để biết liệu điều này có thực sự hoạt động trên dữ liệu của bạn hay không, nhưng dường như nó hoạt động với đoạn bạn đã cung cấp.

>>> import csv 
>>> r = csv.reader(open('foo.csv', 'rb'), quoting=csv.QUOTE_NONE) 
>>> for row in r: print row 
... 
['"A"', '"B"', '"ccc "ccccccc" cccccc"'] 
+0

Tôi đã thử điều đó, nhưng điều đó làm cho toàn bộ tập tin bị hỏng bởi không gian trắng và rác khác. Chỉ có 7 mục trong danh sách csv, phương thức đó cung cấp hàng trăm. –

+0

@Jay Gattuso, trong trường hợp đó, bạn thực sự nên đăng một số dữ liệu ví dụ khác. Tập tin delimiter nào sử dụng? Nếu nó có dấu ngoặc kép và dấu phẩy nằm rải rác trong toàn bộ dữ liệu, thì nó phải sử dụng dấu tách khác nhau. Hoặc người nào khác nó không chỉ là một tập tin csv được hình thành tốt. – senderle

+0

Dấu phân cách là dấu phẩy chuẩn, đơn giản của nó không được định dạng tốt. Tôi bắt đầu nghĩ rằng tôi có thể đã phân tích trước nó, tìm kiếm các điều kiện thích hợp và thay thế các dấu ngoặc kép ở đó với đôi ... Tôi đã nghĩ rằng đó là những gì mô-đun phương ngữ đã được cho. Tôi sẽ đăng thêm các ví dụ, nhưng dữ liệu không thể chia sẻ của nó. Vấn đề là csv xấu của nó, không phải là 'đặc biệt' của nó. –

2

Tôi sẽ viết một trình chuyển đổi sẽ phân tích cú pháp csv ban đầu và xuất một tệp hợp lệ. Bạn có thể sử dụng ", hoặc" \ n làm cơ chế để xác định phân định.

+0

Thats hấp dẫn, nhưng các điểm đánh dấu trường hợp lệ không phải lúc nào cũng trên \ n ranh giới và ", như một giả định đánh dấu CSV hợp lệ sẽ là nguy hiểm. –

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