CSV Helper: анализ пустых и пустых ячеек - PullRequest
0 голосов
/ 31 марта 2020

Я использую CSVHelper для синтаксического анализа файла CSV.

У меня возникли проблемы с определением пустого значения ячейки или ячейки с некоторым значением (ie один или несколько пробелов).

Проблема заключается в том, что когда пользователь добавляет только один пробел в файл в своей ячейке и загружает файл, помощник CSV обрезает это значение в ячейке, так что значение передается как "".

Теперь, когда пользователь не делает добавьте что-нибудь (или типы) в ячейку, это также передается как "".

Итак, я хочу: - Нельзя допускать, чтобы нули загружались. - Допускается один или несколько пробелов в ячейке.

Как этого добиться с помощью CSVHelper. Ниже приведен мой пример кода:

using (TextReader fileReader = new StreamReader(file.OpenReadStream()))
{
    var configuration = new Configuration
    {
        HasHeaderRecord = parameter.HasHeader,
        Delimiter = parameter.Delimiter.ToString(),
        Quote = parameter.Quote
    };
    using (var csv = new CsvReader(fileReader, configuration))
    {
        for (int rowIndex = 0; await csv.ReadAsync(); rowIndex++)
        {
            var record = csv.GetRecord<dynamic>() as IDictionary<string, object>;
            string[] row = record?.Select(i => i.Value as string).ToArray();

            for (int i = 0; i < row.Length; i++)
            {

               //process rows              

            }
        }
    }
}  

Ниже приведен пример csv:

"1"," ","1"
"2","0"," "
"3","","1"

В приведенном выше csv в первой строке есть второй столбец с одним пробелом, который должен быть разрешен, в третьей строке есть 2-й столбец с нулем, который не должен быть разрешен.

Что-нибудь в моем коде отсутствует или есть обходной путь для решения этой проблемы?

Спасибо

1 Ответ

1 голос
/ 31 марта 2020

CsvHelper 15.0.3

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

Может быть, что-то еще происходит?

static void Main(string[] args)
{
    ProcessRecords();            
}

static async void ProcessRecords()
{
    using (var reader = new StringReader("\"1\",\" \",\"1\"\n\"2\",\"0\",\" \"\n\"3\",\"\",\"1\""))
    {
        var configuration = new CsvHelper.Configuration.CsvConfiguration(CultureInfo.InvariantCulture)
        {
            HasHeaderRecord = false,
            Delimiter = ",",
            Quote = '"'
        };
        using (var csv = new CsvReader(reader, configuration))
        {
            for (int rowIndex = 0; await csv.ReadAsync(); rowIndex++)
            {
                Console.WriteLine($"Row: {rowIndex}");
                var record = csv.GetRecord<dynamic>() as IDictionary<string, object>;
                string[] row = record?.Select(i => i.Value as string).ToArray();

                for (int i = 0; i < row.Length; i++)
                {
                    if (row[i] == " ")
                    {
                        Console.WriteLine("Has a space");
                    }
                    if (row[i] == "")
                    {
                        Console.WriteLine("Empty value");
                    }
                }
            }
            Console.ReadKey();
        }
    }
}
...