DinoOnCodeProject Ответов: 2

Удаление лишней запятой в csv при загрузке данных в datatable обеспечивало некоторые условия.


У меня есть ситуация, в которой я загружаю данные из csv в SQL с помощью DataTable. Одна из проблем с данными, известными изначально, заключалась в том, что в одном из полей может быть лишняя запятая, которую необходимо удалить. Это делается идеально, как показано в приведенном ниже коде с использованием блока if.

Теперь в последнее время это приложение не удалось, так как csv-файл содержал больше полей с запятой. Есть ли способ, которым мы можем использовать блок while здесь, чтобы проверить, если все еще oStreamDataValues[22] !="", то остальные поля остаются такими, как есть, и конкатенация происходит в columnName[12], учитывая, что столбец[8] либо фиксирован, либо уже фиксирован. Идея состоит в том, чтобы запустить цикл while до тех пор, пока columnName[22] не станет пустым, а затем поставить его как "Y", чтобы отметить, что эта строка имеет аномалии, и загрузить исправленные данные в DataTable для загрузки в SQL.

Что я уже пробовал:

private static void ReadCsvFileData()
        {
            var destinationFileNameFullPath2 = ConfigurationManager.AppSettings["destinationFileNameFullPath2"]; //full path and name of the csv file
            var oStreamReader = new StreamReader(destinationFileNameFullPath2);
            var oDataTable = new DataTable();
            var rowCount = 0;
            string[] columnNames = null; // for column names
            while (!oStreamReader.EndOfStream)
            {
                var oStreamRowData = oStreamReader.ReadLine().Trim();
                if (oStreamRowData.Length > 0)
                {
                    var oStreamDataValues = oStreamRowData.Split(',');
                    if (rowCount == 0)
                    {
                        rowCount = 1;
                        columnNames = oStreamDataValues;
                        foreach (var csvHeader in columnNames)
                        {
                            var oDataColumn = new DataColumn(csvHeader.ToUpper(), typeof(string));
                            oDataColumn.DefaultValue = string.Empty;
                            oDataTable.Columns.Add(oDataColumn);
                        }
                    }
                    else
                    {
                        var oDataRow = oDataTable.NewRow();
                        for (var i = 0; i < columnNames.Length; i++)
                        {
                            if (oStreamDataValues[22] != "")
                            {
                                oDataRow[columnNames[0]] = oStreamDataValues[0] == null ? string.Empty : oStreamDataValues[0].Trim();
                                oDataRow[columnNames[1]] = oStreamDataValues[1] == null ? string.Empty : oStreamDataValues[1].Trim();
                                oDataRow[columnNames[2]] = oStreamDataValues[2] == null ? string.Empty : oStreamDataValues[2].Trim();
                                oDataRow[columnNames[3]] = oStreamDataValues[3] == null ? string.Empty : oStreamDataValues[3].Trim();
                                oDataRow[columnNames[4]] = oStreamDataValues[4] == null ? string.Empty : oStreamDataValues[4].Trim();
                                oDataRow[columnNames[5]] = oStreamDataValues[5] == null ? string.Empty : oStreamDataValues[5].Trim();
                                oDataRow[columnNames[6]] = oStreamDataValues[6] == null ? string.Empty : oStreamDataValues[6].Trim();
                                oDataRow[columnNames[7]] = oStreamDataValues[7] == null ? string.Empty : oStreamDataValues[7].Trim();
                                oDataRow[columnNames[8]] = oStreamDataValues[9] == null ? oStreamDataValues[8].Trim() : oStreamDataValues[8].Trim() + ' ' + oStreamDataValues[9].Trim();
                                oDataRow[columnNames[9]] = oStreamDataValues[10] == null ? string.Empty : oStreamDataValues[10].Trim();
                                oDataRow[columnNames[10]] = oStreamDataValues[11] == null ? string.Empty : oStreamDataValues[11].Trim();
                                oDataRow[columnNames[11]] = oStreamDataValues[12] == null ? string.Empty : oStreamDataValues[12].Trim();
                                oDataRow[columnNames[12]] = oStreamDataValues[13] == null ? string.Empty : oStreamDataValues[13].Trim();
                                oDataRow[columnNames[13]] = oStreamDataValues[14] == null ? string.Empty : oStreamDataValues[14].Trim();
                                oDataRow[columnNames[14]] = oStreamDataValues[15] == null ? string.Empty : oStreamDataValues[15].Trim();
                                oDataRow[columnNames[15]] = oStreamDataValues[16] == null ? string.Empty : oStreamDataValues[16].Trim();
                                oDataRow[columnNames[16]] = oStreamDataValues[17] == null ? string.Empty : oStreamDataValues[17].Trim();
                                oDataRow[columnNames[17]] = oStreamDataValues[18] == null ? string.Empty : oStreamDataValues[18].Trim();
                                oDataRow[columnNames[18]] = oStreamDataValues[19] == null ? string.Empty : oStreamDataValues[19].Trim();
                                oDataRow[columnNames[19]] = oStreamDataValues[20] == null ? string.Empty : oStreamDataValues[20].Trim();
                                oDataRow[columnNames[20]] = oStreamDataValues[21] == null ? string.Empty : oStreamDataValues[21].Trim();
                                oDataRow[columnNames[21]] = oStreamDataValues[22] == null ? string.Empty : oStreamDataValues[22].Trim();
                                oDataRow[columnNames[22]] = 'Y';
                            }
                            else
                            {
                                oDataRow[columnNames[i]] = oStreamDataValues[i] == null ? string.Empty : oStreamDataValues[i].Trim();
                            }
                        }
                        //Creating DataTable
                        oDataTable.Rows.Add(oDataRow);
                        
                    }
                }
            }
            oStreamReader.Close();
            oStreamReader.Dispose();
//SQLBulkUpload code goes here.
}

2 Ответов

Рейтинг:
0

Maciej Los

Я хотел бы предложить, чтобы использовать ADO.NET (oledb) для вместо свой CSV-файла читатель. ADO.NET (oledb для)[^] позволяет читать текстовые файлы с разделителями в объект datatable. Используя файл schema. ini, вы сможете определить набор столбцов для чтения.

Пожалуйста, смотрите:
Доступ к данным Microsoft Office из .Сетевые приложения[^]
Много шума из-за текстовых файлов[^]
Схемы.ini-файл (текстовый файл драйвера )[^]
Как добавить определение схемы в источник данных текстового файла[^]
Использование OleDb для импорта текстовых файлов (tab, CSV, custom)[^]
Чтение Определенных Столбцов Текстового Файла[^]


Рейтинг:
0

#realJSOP

Посмотрите на эту статью - Парсер CSV файлов[^]


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