Выход из запятой (,) из ячейки csv при экспорте данных в таблицу базы данных - PullRequest
0 голосов
/ 21 ноября 2019

У меня есть CSV-файл, в котором есть поле с запятой. например, в столбце местоположения офиса у меня есть значение xyz, здание. Когда я проверил значение через отладчик, он показывает только "\" xyz ". Я попытался экранировать запятую и обратную косую черту, используя Replace(",","") и Replace("\"",""), но это не удалось. Также я получаю дополнительные \ в результате какотмечено красным кружком.

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

enter image description here

Я также попробовал следующую функцию:

public static string RemoveColumnDelimitersInsideValues(string input)
    {

        const char valueDelimiter = '"';
        const char columnDelimiter = ',';

        StringBuilder output = new StringBuilder();

        bool isInsideValue = false;
        for (var i = 0; i < input.Length; i++)
        {
            var currentChar = input[i];

            if (currentChar == valueDelimiter)
            {
                isInsideValue = !isInsideValue;
                output.Append(currentChar);
                continue;
            }

            if (currentChar != columnDelimiter || !isInsideValue)
            {
                output.Append(currentChar);
            }

        }
        return output.ToString();
    }

Пожалуйста, помогите в решении проблем. Спасибо

Ответы [ 4 ]

0 голосов
/ 21 ноября 2019

В вашем коде есть 3 проблемы, на которые стоит обратить внимание.

1. Парсинг CSV может быть сложным

Правильно ли вы обрабатываете многострочную строку кода? Не могли бы вы обработать код " внутри одного из столбцов (т.е. экранированный ")?

Я рекомендую использовать библиотеку чтения csv (также известный как пакет NuGet).

Обратная косая черта отсутствует

Вот файл.

1,"The string in the first row has a comma, and an f, in it"
2,The string in the 2nd row does not have a comma in it 

Вот что показывает Visual Studio (здесь я использую VS Code).

enter image description here

Вот что печатает Console.WriteLine.

1,"The string in the first row has a comma, and an f, in it"
2,The string in the 2nd row does not have a comma in it 

3. Замена запятых

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

0 голосов
/ 21 ноября 2019

String.Replace не изменяет существующую строку, она возвращает новую. Из-за этого у вас есть та же старая строка row вне проверки IsNullOrEmpty.

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

Если вы хотите удалить запятые и кавычки, ваш код может выглядеть следующим образом:

if (string.IsNullOrEmpty(row))
{
    row = row.Replace(",", "").Replace("\"", "");
}

Если вы хотите экранировать кавычки и запятые,ваш код может выглядеть как

if (row != null && row.Contains(","))
{
    row = "\"" + row.Replace("\"", "\"\"") + "\"";
}
0 голосов
/ 21 ноября 2019

Попробуйте использовать TextFieldParser, в csv, если значение столбца имеет запятую, значение столбца экранируется с помощью qoutes, поэтому добавление HasFieldsEnclosedInQuotes в значение true автоматически прочитает его как один столбец.

using Microsoft.VisualBasic.FileIO;


using (TextFieldParser reader = new TextFieldParser(csvpath))
       {
         reader.Delimiters = new string[] { "," };
         reader.HasFieldsEnclosedInQuotes = true;
         string[] col =  reader.ReadFields();
       }
0 голосов
/ 21 ноября 2019

Символ \, который вы видите, отсутствует в реальной строке, это просто экранирующий символ, добавленный в представление отладчика.

Нажмите на лупу, чтобы получить фактическое значение строки.

enter image description here

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

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