Dữ liệu & bảng tính · CSV Trình dọn dẹp
Cách trình phân tích cú pháp CSV xử lý các trích dẫn, dấu phẩy được nhúng và dòng mới trong trường
· Cách thức hoạt động
csv phân tích cú pháp data-formats
Việc phân tách bằng dấu phẩy hoạt động cho đến khi một trường chứa dấu phẩy, dấu ngoặc kép hoặc dấu ngắt dòng. Bài đăng này giải thích về máy trạng thái nhỏ mà trình phân tích cú pháp CSV thực sự sử dụng, lý do tồn tại các quy tắc trích dẫn và công cụ sửa chữa sẽ làm gì khi trích dẫn bị hỏng.
Trường địa chỉ có dấu phẩy đã dịch chuyển mọi cột sang bên phải — tại sao việc phân tách đơn giản không được phân tích cú pháp
Việc tách một dòng ở mỗi dấu phẩy không thành công ngay khi địa chỉ bưu chính, ghi chú hoặc mô tả sản phẩm chứa ký tự đó. Dấu phân cách chỉ kết thúc một trường trong khi trình phân tích cú pháp nằm ngoài trường được trích dẫn. Dấu ngoặc kép bên trong, cùng một byte thuộc về giá trị và phải đạt đến bản xem trước không thay đổi.
ToolAcre chứng minh điều này bằng các thử nghiệm thay vì cho rằng CSV là văn bản đơn giản. Tệp dấu chấm phẩy chứa dấu phẩy bên trong ghi chú được trích dẫn vẫn được phát hiện là được phân cách bằng dấu chấm phẩy vì mỗi ứng cử viên được phân tích cú pháp thành hàng trước khi tính điểm hình chữ nhật của nó. Số lượng dấu câu thô không bao giờ quyết định phương ngữ.
Quy tắc trích dẫn - các trường chứa dấu phân cách, dấu ngoặc kép hoặc dòng mới được gói trong dấu ngoặc kép và dấu ngoặc kép bên trong được nhân đôi
Trường chứa dấu phân cách đã chọn, dấu ngoặc kép, nguồn cấp dữ liệu dòng hoặc dấu xuống dòng được trích dẫn trong quá trình tuần tự hóa. Một trích dẫn kép theo nghĩa đen bên trong trường trích dẫn được thể hiện bằng hai dấu ngoặc kép liền kề. Khi phân tích cú pháp, cặp đó đóng góp một trích dẫn vào ô và không đóng trường.
Dấu ngoặc kép chỉ mở trạng thái được trích dẫn khi chúng xuất hiện ở đầu một trường trống. Trong giá trị không được trích dẫn, chẳng hạn như ống 12", trích dẫn vẫn là dữ liệu bằng chữ. Lựa chọn triển khai đó đã được kiểm tra và ngăn dấu đo ở giữa văn bản nuốt các cột tiếp theo.
Trình phân tích cú pháp dưới dạng máy trạng thái - dấu ngoặc kép bên trong so với dấu ngoặc kép bên ngoài và cách một ký tự tại một thời điểm quyết định nơi trường kết thúc
Vòng lặp lõi theo dõi trường hiện tại, hàng hiện tại và trạng thái `inQuotes`. Dấu ngoặc kép bên ngoài, dấu phân cách sẽ đẩy một trường và CR, LF hoặc CRLF đẩy một hàng. Dấu ngoặc kép bên trong, mọi ký tự đều được thêm vào ngoại trừ dấu ngoặc kép, ký tự này tạo thành một cặp thoát hoặc thoát khỏi trạng thái trích dẫn.
Tiến trình một ký tự này giải thích tại sao một biểu thức chính quy hoặc phân chia dòng đơn giản lại dễ vỡ. Việc một dòng mới có kết thúc một bản ghi hay không phụ thuộc vào dữ liệu đầu vào trước đó và liệu một trích dẫn có đóng trường hay không phụ thuộc vào báo giá tiếp theo. Trình phân tích cú pháp mang chính xác trạng thái tối thiểu đó thông qua chuỗi.
Dòng mới được nhúng - tại sao một hàng có thể trải dài trên nhiều dòng và tại sao các công cụ dựa trên dòng như bản ghi đếm sai grep hoặc wc
Trường được trích dẫn có thể chứa LF, CRLF hoặc một CR đơn độc và những ký tự đó vẫn nằm trong giá trị. Do đó, một bản ghi logic có thể chiếm nhiều dòng hiển thị trong trình soạn thảo văn bản. Đếm các dòng vật lý bằng lệnh định hướng dòng không nhất thiết phải đếm các hàng dữ liệu.
Sau dấu ngoặc kép, dấu phân cách tiếp theo hoặc phần cuối bản ghi sẽ tiếp tục ý nghĩa cấu trúc. Các thử nghiệm của ToolAcre xác nhận cả LF được nhúng và CRLF được nhúng, sau đó xác minh rằng chỉ một hàng được tạo. Hành vi này không được suy ra từ nhãn RFC; nó được thực hiện trực tiếp bởi máy trạng thái được vận chuyển.
Trích dẫn bị hỏng - các trích dẫn không cân bằng sẽ nuốt chửng phần còn lại của tệp và cách công cụ sửa chữa trích dẫn lại các trường một cách nhất quán
Bản phác thảo hứa hẹn sửa chữa trích dẫn, nhưng một trích dẫn không được tiết lộ vốn dĩ rất mơ hồ. ToolAcre báo cáo `UNCLOSED_QUOTE` đối với hàng nơi trạng thái được trích dẫn bắt đầu và đọc mọi thứ sau đó vào một trường. Nó không phát minh ra một vị trí đóng hoặc trích dẫn lại các hồ sơ dự định.
Lỗi bảo thủ đó sẽ bảo tồn văn bản đã sử dụng để kiểm tra và tránh giả vờ biết liệu một trích dẫn hoặc dòng mới sau đó có được coi là dữ liệu hay không. Sửa nguồn hoặc tạo lại bản xuất, sau đó tải lại. Việc tuần tự hóa có thể bình thường hóa một bảng được phân tích cú pháp thành công; nó không thể khôi phục ranh giới hàng mà nguồn không đúng định dạng không thể xác định được.
Trích dẫn bị hỏng được báo cáo nhưng không được sửa chữa; một trường không được đóng sẽ sử dụng văn bản còn lại
Sử dụng `name,note` làm tiêu đề, sau đó sử dụng một hàng có Ada và một ghi chú chứa dấu phẩy cùng với dấu ngắt dòng và một hàng khác có ghi chú là `She said "hi"`. Trong nguồn CSV, trích dẫn ghi chú dài và viết dấu ngoặc kép bên trong là `""hi""`. Trình phân tích cú pháp trả về hai hàng dữ liệu và giữ cả hai ký tự đặc biệt.
Khi được xê-ri hóa với dấu ngoặc kép tối thiểu, tên đơn giản không cần dấu ngoặc kép, trong khi các trường ghi chú được trích dẫn vì chúng chứa các ký tự cấu trúc. Phân tích cú pháp đầu ra đó một lần nữa sẽ mang lại cùng một tiêu đề và ô ngay cả khi các trích dẫn nguồn dư thừa biến mất. Sự bình đẳng về dữ liệu, chứ không phải kiểu dáng từng byte, xác định chuyến đi khứ hồi này.
Điều này không bao gồm những gì - các phương ngữ sử dụng dấu gạch chéo ngược và phương pháp phỏng đoán để đoán ý định khi trích dẫn thực sự không rõ ràng
Các phương ngữ thoát dấu gạch chéo ngược nằm ngoài trình phân tích cú pháp. Dấu gạch chéo ngược trước một trích dẫn không có ý nghĩa đặc biệt về máy trạng thái ở đây; nó vẫn là văn bản, trong khi trích dẫn được diễn giải theo quy tắc trích dẫn kép. Công cụ này cũng từ chối đoán ý định khi câu trích dẫn mở đầu vẫn chưa khớp.
Những ranh giới đó quan trọng khi nhập kết xuất cơ sở dữ liệu được định cấu hình cho một quy ước thoát khác. Xác định phương ngữ của nhà sản xuất trước khi tải hoặc xuất với trích dẫn kiểu RFC. Trình phân tích cú pháp âm thầm nhận ra một số quy tắc thoát không tương thích có thể biến dấu gạch chéo ngược theo nghĩa đen thành cú pháp điều khiển và che giấu sự không khớp.
Tôn trọng các dấu ngoặc kép và các hàng vẫn được giữ nguyên — cách sửa chữa trích dẫn của ToolAcre CSV Cleaner tạo ra một tệp mà trình phân tích cú pháp tiêu chuẩn đọc chính xác
Việc tôn trọng trạng thái được trích dẫn sẽ giữ các dấu phân cách và ghi lại phần kết thúc bên trong các ô chứa chúng. ToolAcre cũng xử lý ba biểu mẫu kết thúc dòng, xóa UTF-8 BOM ở đầu dòng và báo cáo độ rộng hàng không khớp. Những hành vi này là những phần độc lập của một lần đọc cấu trúc chứ không phải là một tập hợp các thủ thuật tìm kiếm và thay thế.
Sau khi phân tích cú pháp hợp lệ, quá trình tuần tự hóa sẽ tăng gấp đôi dấu ngoặc kép được nhúng và trích dẫn bất kỳ trường nào cần bảo vệ, với đầu ra CRLF theo mặc định. Sau khi trích dẫn không hợp lệ, hãy dừng lại và sửa chữa từ bằng chứng nguồn. Công cụ này có thể chuẩn hóa các ô đã biết; nó không yêu cầu xây dựng lại một bảng không thể biết được.