Một thuật toán có thể để nhận được phân cách có thể (s) là khá đơn giản, và giả định các dữ liệu đúng định dạng:
- Đối với mỗi delimiter,
- Đối với mỗi dòng,
- Tách dòng bằng dấu tách, kiểm tra
length
.
- Nếu
length
của nó là không bằng với độ dài của dòng cuối cùng, đây không phải là dấu phân cách hợp lệ.
Bằng chứng về khái niệm (không xử lý các lĩnh vực trích dẫn):
function guessDelimiters (text, possibleDelimiters) {
return possibleDelimiters.filter(weedOut);
function weedOut (delimiter) {
var cache = -1;
return text.split('\n').every(checkLength);
function checkLength (line) {
if (!line) {
return true;
}
var length = line.split(delimiter).length;
if (cache < 0) {
cache = length;
}
return cache === length && length > 1;
}
}
}
Vui lòng cung length > 1
là để đảm bảo các split
không chỉ trả lại toàn bộ dòng. Lưu ý rằng điều này trả về một mảng các dấu phân tách có thể có - nếu có nhiều hơn một mục, bạn có một vấn đề mơ hồ.
Đây là cách Python thực hiện: http://svn.python.org/view/python/trunk/Lib/csv.py?view=markup#l162 – Blender
Bạn đang sử dụng mô-đun nào để phân tích cú pháp CSV? – Alex
@Blender Nó sẽ là tốt đẹp để cổng nó cho javascript. Tôi không phải là chuyên gia về python ... và tôi không thấy câu hỏi tương tự về SO. –