2017-01-12 2 views
1

Моей проблемы:Regex для очистки CSV из запутанных символов

Я использую CSV, который вышел из некоторых программ, и проблема в том, что эта программа не обрабатывает CSV так хорошо причины есть некоторые строки в csv, которые содержат в себе цитату и что является обертыванием строки, также являются кавычками, поэтому у меня возникают проблемы с ее синтаксическим анализом.

так это нормально CSV:

"one","two","three" 

и вот мой случай:

"one","tw"o","three" 

Так У меня возникли проблемы при разборе строки, как "tw"o". В основном это проблема с программным обеспечением, которое выводит файл, и я не могу редактировать это программное обеспечение.

Итак, я думал, что могу создать регулярное выражение, которое будет принимать ненужные цитаты или запятые, и убедитесь, что каждая строка завернута в кавычки и разделена запятой, кто-то знает, как я могу ее достичь?

им с помощью tototoshi библиотеки для Скале

+0

Существует ли конкретная причина, почему вы не используете пакет 'csv' для Python для обработки файла' .csv'? –

+0

@WillemVanOnsem im, использующий tototoshi для scala, но эти библиотеки не могут проанализировать его, поскольку он не является правильным форматом ... если это были «один», «два», «три» без проблем, а его «один», «два», o "," three ", так что библиотека не может разобрать его – JohnBigs

+0

Почему вы всегда смотрите на регулярные выражения? Даже если вы найдете что-то для этого, я предполагаю, что это может выглядеть довольно ужасно. Heck: вам нужно ** других ** людей даже подумайте, как легко вам будет ** поддерживать ** это регулярное выражение с течением времени? Смысл: иногда нужно подумать о том, чтобы сесть и написать свой собственный синтаксический анализатор и сделать что-то явно, вместо того, чтобы выбрасывать регулярное выражение монстра , – GhostCat

ответ

1

Я попробовал модуль Csv Python, и он был в состоянии сделать это (звучит, как взломать, но файл ввода неправильно в конце концов, и с помощью регулярных выражений будет хак тоже) :

import csv 

z = '''"one","tw"o","three"''' 

cr = csv.reader([z]) 
print(next(cr)) 

результат:

['one', 'two"', 'three'] 

по какой-то причине, цитата была перенесена в конец строки (действительный способ поставить двойные кавычки в поле будет удвоить) ,

Чтобы удалить его, вы можете сделать

print([x.replace('"',"") for x in next(cr)]) 

получить

['one', 'two', 'three'] 

к сведению, что CSV будет выпускать 4 поля с "one","tw",o","three" так, если котировка следует запятая, ничего не работает, только человека проверка можно исправить.

0

Одно довольно простое регулярное выражение решение, которое может работать для вас это:

регулярное выражение: (?<=\w)"(?=\w) //global flag

заменить: '' //blank string

Пока мы можем рассматривать «плохие» двойные кавычки, как те, которые являются в окружении alphanumerics это будет работать. Это всего лишь lookbehind для буквенно-цифровой, двойной кавычки и lookahead для буквенно-цифровой. Это не соответствовало бы двойной цитате, сбежавшей с обратной косой чертой или другой двойной цитатой, поэтому "" или \" было бы в порядке.

demo here

0

Похоже, вы не можете предсказать, какие значения с неэкранированными кавычками, вы можете получить. Невозможно корректно очистить его с помощью регулярного выражения.

Возможно, попробуйте univocity-parsers, поскольку он имеет синтаксический анализатор CSV, который может правильно обрабатывать этот вид ввода. Пример:

//first configure the parser 
    CsvParserSettings settings = new CsvParserSettings(); 

    //override the default unescape quote handling. This seems more appropriate for your case. 
    settings.setUnescapedQuoteHandling(UnescapedQuoteHandling.STOP_AT_CLOSING_QUOTE); 

    //then create a parser and parse your input line: 
    CsvParser parser = new CsvParser(settings); 
    List<String[]> results = parser.parseAll(<your input here>); 

Надеюсь, это поможет.

Отказ от ответственности: Я являюсь автором этой библиотеки. Это бесплатно и бесплатно (версия Apache v2.0)

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