2015-08-14 2 views
-2

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

Каждая запись в файле csv содержится в кавычках и ограничена запятой. Записи запятые в них и одна запись из 90000 записей IM дело с еще один сингл «который гадости вверх Readline.

Запись выглядит как это„24“скучное»,

Так что я m глядя, чтобы написать регулярное выражение, чтобы вставить в BeforeReadRecord, который пройдет и заменит все экземпляры «пробелом».

Я новичок в регулярном выражении, но я не нашел способа исключить три случая. Case один: каждая строка начинается с « Случай два: каждая строка заканчивается« Дело три: каждое поле разделяется «,»

Я пытаюсь выяснить, как я мог исключить эти три случая и остался, чтобы просто заменить любого отступника ».

До сих пор я терпел неудачу и даже не уверен, есть ли способ сделать это. Возможно, кто-то знает о лучшем парсере csv, который обрабатывает и этот нечетный случай?

EDIT: Хорошо, вот что я получил. Требуется немного времени для обработки (также просто меняется любой выброс «в», что отлично, поскольку данные, содержащие кавычки, необходимы для любых запросов), но при поиске любых ловушек, которые я могу впасть, чтобы сделать это быстрее, но это казалось самое быстрое решение до сих пор (заняло около 7 секунд для 92 000 записей), но не все равно проверяется каждая строка, так что ... Мое предыдущее решение было противным вложенным, если это показалось 30 секундам или около того в ходе обработки записи учитываются для всех сценариев, за исключением тех, где кто-то решает поставить случайный », в конце поля ... надеясь, что я не попаду в такую ​​запись, но это меня не удивит.

in its own method{ 
    engine.BeforeReadRecord += (sender, args) => 
       args.RecordLine = checkQuote(args.RecordLine); 
       var records = engine.ReadFile(reportFilePath); 
} 

private static string checkQuote(string checkString) 
     { 
      if (checkString.Substring(0, 1) == @"""") 
      { 
       string removeQuote = @"""" + checkString.Replace(@"""", "'").Replace(@"','", @""",""").Remove(checkString.Length-1,1).Remove(0,1) + @""""; 
       return removeQuote; 
      } 
      else 
       return checkString; } 
+0

, пожалуйста, покажите, что вы пробовали. –

+0

хорошо, но это не где близко Закрыть 'FileHelperEngine engine = new FileHelperEngine (); engine.BeforeReadRecord + = (отправитель, args) => args.RecordLine = Regex.Replace (args.RecordLine, @ "(?!" "," ")" "", ""); var records = engine.ReadFile (reportFilePath); ' – user3776809

+0

есть все равно, чтобы исключить те, которые есть в шаблоне, хотя и только захватить ", которые не подходят в этих шаблонах? – user3776809

ответ

1

Обычно считыватели форматов не обрабатывают неправильно сформированную входную скважину. Почему они должны? Если вы дадите плохие данные для чтения CSV, я бы ожидал, что это к barf. Я редко получал удачу с компьютерным программным обеспечением, которое делает предположения о том, что я имел в виду.

Вам действительно нужно регулярное выражение? Если вы определяете straggler как последний символ кавычки, когда число нечетно, тогда тривиально удалить последний: просто посчитайте их, и если число нечетное, удалите последний.

Например:

var quoteCount = inputString.Count(c => c == '\"'); 
if ((quoteCount % 2) == 1) 
{ 
    inputString = inputString.Remove(inputString.LastIndexOf('\"')); 
} 

Done и сделано.

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

Для более сложных моделей (т.е. вы ищете "," или для цитаты в начале и в конце концов, вы просто написать простую государственную машину. Это, наверное, десяток строк кода.

Я понимаю, что вы может быть в состоянии сделать это с помощью регулярных выражений.Я нахожу regex отлично подходит для поиска вещей и простых замен.Для более сложных правил, таких как «заменить цитату пространством, если цитата не находится в начале или конце строки или рядом с запятой», мне трудно найти хорошее выражение. Например, что об этом случае:

"first name","last name","","phone" 

Вы должны принять это пустое поле (т.е. «») во внимание. Вы также должны учитывать пробелы между полями (т. Е. "first" , "last" , "") и целый ряд других вещей. Я уверен, что регулярное выражение может это сделать. Мой опыт заключается в том, что я обычно могу написать простую машину состояний и доказать, что она верна быстрее, чем я могу разгадать требуемое регулярное выражение. И я уверен, что через полгода я буду легче разбираться в государственной машине.

+0

Я думаю, вы, возможно, неправильно поняли необходимость регулярного выражения, потому что цитата с отставкой может быть где угодно. Текст отформатирован в csv как таковой «Первая запись», «Вторая запись», «Третья запись», «За« запись », как вы можете видеть, я просто пытаюсь выяснить случаи, похожие на четвертую запись – user3776809

+0

@ user3776809: Смотрите мое обновление. Вы можете написать для этого простой государственный автомат. –

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