2010-01-26 32 views
5

Một dòng CSV tầm thường có thể được phun nước bọt sử dụng chức năng chuỗi phân tách. Nhưng một số dòng có thể có ", ví dụ:Làm thế nào để đọc một dòng với "CSV?

"good,morning", 100, 300, "1998,5,3" 

do đó trực tiếp sử dụng chuỗi chia sẽ không giải quyết được vấn đề.

giải pháp của tôi là trước hết phải chia ra các dòng sử dụng , và sau đó kết hợp các chuỗi với " tại sau đó bắt đầu hoặc kết thúc của chuỗi.

các thực hành tốt nhất cho vấn đề này là gì?

Tôi quan tâm nếu có đoạn mã Python hoặc F # cho điều này.

EDIT: Tôi quan tâm nhiều hơn đến chi tiết triển khai hơn là sử dụng thư viện.

Trả lời

9

Có mô-đun csv bằng Python, xử lý việc này.

Chỉnh sửa: Tác vụ này thuộc danh mục "xây dựng một từ khóa". Cách thông thường để làm nhiệm vụ như vậy là để xây dựng một máy nhà nước

Chiếc máy nhà nước đối với nhiệm vụ này có lẽ chỉ cần hai tiểu bang (hoặc sử dụng một thư viện lexer/khuôn khổ mà sẽ làm điều đó cho bạn.):

  • Ban đầu, nơi nó đọc mọi ký tự ngoại trừ dấu phẩy và dòng mới như một phần của trường (ngoại lệ: dấu cách hàng đầu và cuối), dấu phẩy làm dấu tách trường, dòng mới làm dấu phân tách bản ghi. Khi nó gặp phải dấu mở đầu, nó đi vào trạng thái
  • trạng thái đọc được trích dẫn, trong đó mọi ký tự (bao gồm dấu phẩy & dòng mới) không bao gồm báo giá được coi là một phần của trường, báo giá không được báo giá có nghĩa là kết thúc đọc được trích dẫn -trường (trở lại trạng thái ban đầu), một báo giá theo sau là một trích dẫn được coi là một trích dẫn đơn (trích dẫn thoát).

Bằng cách này, giải pháp ghép nối của bạn sẽ bị vỡ trên "Field1","Field2" hoặc "Field1"",""Field2".

+5

Giống như với hầu hết các vấn đề phân tích, đó là một thực hành bền vững hơn để sử dụng một thư viện nếu có. Nếu OP thực sự quan tâm đến việc thực hiện, tôi chắc chắn thư viện Python là mã nguồn mở. –

+3

Như chúng ta nói trong cộng đồng Python: "Sử dụng nguồn, Luke". Nó hoàn toàn mở và đã được cài đặt với Python. Chỉ cần đọc nó. –

3

Từ python's CSV module:

đọc một tập tin CSV bình thường:

import csv 
reader = csv.reader(open("some.csv", "rb")) 
for row in reader: 
    print row 

Đọc một tập tin với một dạng thức khác:

import csv 
reader = csv.reader(open("passwd", "rb"), delimiter=':', quoting=csv.QUOTE_NONE) 
for row in reader: 
    print row 

Có một số nice usage examples in LinuxJournal.com.

Nếu bạn quan tâm đến chi tiết, hãy đọc "split string at commas respecting quotes when string not in csv format" hiển thị một số regexen đẹp liên quan đến vấn đề này hoặc chỉ cần đọc nguồn mô-đun csv.

1

Chương 4 của thực hành lập trình cho cả triển khai C và C++ của trình phân tích cú pháp CSV.

1

Các generic chi tiết thực hiện sẽ là một cái gì đó như thế này (chưa được kiểm tra)

def csvline2fields(line): 
    fields = [] 
    quote = None 
    while line.strip(): 
     line = line.strip() 
     if line[0] in ("'", '"'): 
      # Find the next quote: 
      end = line.find(line[0]) 
      fields.append(line[1:end]) 
      # Find the beginning of the next field 
      next = line.find(SEPARATOR) 
      if next == -1: 
       break 
      line = line[next+1:] 
      continue 
     # find the next separator: 
     next = line.find(SEPARATOR) 
     fields.append(line[0:next]) 
     line = line[next+1:] 
+0

Thực tế, đề xuất xem xét mô-đun CSV trong nguồn mở Python là tốt hơn. Tôi ngớ ngẩn quá. –

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