2015-09-08 4 views
3

В настоящее время я пытаюсь различать различные текстовые форматы с последовательным интерфейсом. В основном между XBRL, XML, CSV и JSON.Дифференцирование XBRL, XML, CSV и JSON

Я хотел бы предположить, что, проверяя шаги, если мы используем синтаксический анализатор для синтаксического анализа XBRL/XML и возвращаемся без какого-либо исключения, то он является допустимым XML-документом и нуждается в дальнейшей проверке, чтобы увидеть, является ли этот документ регулярный xml или xbrl.

Если первая проверка не удалась, попробуйте разобрать csv. Если разбор csv возвращает исключение, попробуйте разбор в качестве JSON. Если ни одно из указанных выше не работает, это недопустимый документ.

Будет ли это исключительным способом определения типа текстового формата, который является документом? Или есть лучший способ? (читая первые несколько байтов документа и т. д.).

благодаря

+1

Возможно, некоторые данные могут интерпретироваться более чем одним способом (например, одна строка в двойных кавычках может быть действительной CSV * и * действительной JSON), но в этом случае нет «идеального» ответа в любом случае. Если все в порядке, используйте любой допустимый формат, а затем прочитайте несколько байтов и закажите свои тесты соответственно (например, lota '<' предлагает сначала попробовать XML), это сэкономит время - просто перейдите к первому, который не дает исключения. Наконец, обратите внимание, что для CSV существует множество «параметров» (например, типы цитирования, встроенные новые строки и т. Д.). - IOW огромное разнообразие слегка несовместимых форматов CSV. :( –

ответ

1

Если вы знаете, что JSON будет объект или массив, и что содержание должно быть одним из тех, четыре ...

if(content.charAt(0) == "[" || content.charAt(0) == "{") { 
    // JSON 
} else if(content.charAt(0) == "<") { 
    if(content.indexOf("xmlns=\"http://www.xbrl.org/2001/instance\"") >= 0) { 
     // XBRL 
    } else { 
     // XML 
    } 
} else { 
    // CSV ?... 
    // first remove strings 
    var testCSV = content.replace("\"\"", ""); // remove escaped quotes 
    testCSV = testCSV.replace(/".*?"/g, ""); // match-remove quoted strings 
    var lines = testCSV.split("\n"); 
    if(lines.length === 1 && lines[0].split(",").length > 1) { 
     // only 1 row so we can only verify if there is two or more columns 
     // CSV 
    } else if(lines.length > 1 && lines[0].split(",").length > 1 && lines[0].split(",").length === lines[1].split(",").length) { 
     // we know there's multiple lines with the same number of columns 
     // CSV 
    } 
    // can't be sure what it is 
    // ??? 
} 

выше даст вам разумное количество уверенности.

EDIT Я добавил быстрый CSV-тест.

+0

Я считаю, что контент будет либо одним из 4-х вариантов. Но если мы должны включить шансы на контент, чтобы он не был одним из 4, как мы должны это делать? Я подумал о разборе документа используя парсер JSON, XML и CSV.Если все три синтаксические анализаторы терпят неудачу, мы вышлем исключение, указав, что документ не является ни одним из форматов. Но я ограничен только тем, что доступно в библиотеке Java, и не может использовать какие-либо другие внешние библиотеки для синтаксического анализа.Я считаю, что встроенный JSON и XML-парсер встроен, но нет парсеров CSV. – sincreadys

+0

@sincreadys - Проверка формата CSV не слишком сложна, я добавил код для демонстрации. Самая сложная часть спецификации CSV как обращаться со строками и кавычками, поэтому сначала я удаляю их с помощью простой замены, а затем не-жадного регулярного выражения, чтобы соответствовать окружающим кавычкам и строковым контентом. После удаления всех строк мы просто разделим на разрыв строки и каждую строку разделяется o n запятая (разделитель столбцов). Теперь просто нужно убедиться, что каждая строка содержит одинаковое количество столбцов (что соответствует спецификации CSV). Мой код проверяет только первые 2 строки, но вы можете быть более тщательными, зацикливая –

Смежные вопросы