Заменить запятую в строке, НО только в определенной позиции в VB.net - PullRequest
2 голосов
/ 12 декабря 2011

Я читаю CSV-файл на VB.net и сохраняю строку в базе данных SQL. Позже в моем коде строка SQL извлекается в приложении, и функция Split используется для получения значений 'field'. Разделение выполняется с использованием запятой в качестве разделителя.

Приложение обрабатывает много других файлов (включая excel), и для всех них используется функция разделения.

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что один из прочитанных мною файлов csv имеет значение поля, которое начинается с «, за которым следуют несколько значений, разделенных запятой, и заканчивается другим». При обычном чтении файла csv каждое из этих значений отдельного поля принимается за отдельное значение. Надеюсь, у меня есть смысл?

Пример строки:

Elker,MissB,"Bus, Taxi, Train, Ferry, Parking, Toll",800253

там, где нужно разделить только 4 столбца, вместо этого они разделяются на 9 столбцов.

Что я хочу сделать, так это заменить запятые после 'Bus' и до 'Toll' на '?' вместо этого.

Я пытался использовать Replace, включая перегруженный со стартовой позицией, но в итоге он заменяет ВСЕ запятые в строке на «?»

Попытка 1:

If vstrLine(intStartPos) = "," Then
    strRetVal = Replace(vstrLine(intStartPos), ",", "?")
end if

, где vstrLine равно Elker,MissB,"Bus, Taxi, Train, Ferry, Parking, Toll",800253 и intStartPos является первым экземпляром запятой после "

Возвращает только '?' а не строка с 1 запятой, замененной на '?'

Попытка 2:

If vstrLine(intStartPos) = "," Then
    strRetVal = Replace(vstrLine, ",", "?", intStartPos)
end if

Возвращает строку со всеми запятыми, замененными на '?'

Ответы [ 3 ]

1 голос
/ 12 декабря 2011

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

Пример:

Dim input As String = "Elker,MissB,""Bus, Taxi, Train, Ferry, Parking, Toll"",800253"
Dim values As MatchCollection = Regex.Matches(input, "("".*""|[^,]+)")

For Each value As Match In values
  Console.WriteLine(value.Value)
Next

Выход:

Elker
MissB
"Bus, Taxi, Train, Ferry, Parking, Toll"
800253
0 голосов
/ 12 декабря 2011

Использовать встроенный в VB класс TextFieldParser. Он может обрабатывать чтение CSV-файла и правильно обрабатывает запятые в поле.

http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.fileio.textfieldparser.aspx

0 голосов
/ 12 декабря 2011

Зачем изобретать велосипед?Если вы не хотите делать что-то особенное, используйте уже созданный CSV-ридер.Я бы порекомендовал этот .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...