Экспорт CSV в SQL в C # - как сместить экспорт на один столбец - PullRequest
0 голосов
/ 11 октября 2019

Я использую C # для анализа файла csv и экспорта в таблицу базы данных SQL Server. Схема таблицы базы данных практически идентична схеме файла csv, за исключением того, что в таблице в качестве первого столбца указан столбец Идентификация первичного ключа.

Проблема: the 2-й столбец таблицы базы данных, который должен получить столбец 1-й файла CSV, фактически получает 2-й столбец файла CSV. В коде предполагается, что первый столбец PK Identity таблицы базы данных является первым столбцом, в который следует записать файл CSV. В случае, если это сбивает с толку, предположим, что столбцы 1, 2 и 3 файла CSV имеют заголовки с именами Contoso1, Contoso2 и Contoso3 соответственно. Столбцы таблицы базы данных с 1 по 4 называются Id, Contoso1, Contoso2 и Contoso3 соответственно. Во время экспорта столбец Id правильно заполняется идентификатором id, но затем столбец Contoso1 таблицы базы данных заполняется столбцом Contoso2 файла CSV, и отключение одним столбцом продолжаетсядля всех 300 столбцов.

Вот код. Я ищу способ сделать смещение на один столбец с этим кодом. Если возможно, я бы хотел избежать жесткого кодирования схемы отображения, так как существует более 300 столбцов.

using System;
using System.Data.SqlClient;
using System.Data;
using Microsoft.VisualBasic.FileIO;

namespace CSVTest
{
    class Program
    {
        static void Main(string[] args)
        {

            string csv_file_path = @"pathToCsvFile";
            DataTable csvData = GetDataTabletFromCSVFile(csv_file_path);
            Console.WriteLine("Rows count:" + csvData.Rows.Count);
            InsertDataIntoSQLServerUsingSQLBulkCopy(csvData);
        }



        private static DataTable GetDataTabletFromCSVFile(string csv_file_path)
        {
            DataTable csvData = new DataTable();
            try
            {
                using (TextFieldParser csvReader = new TextFieldParser(csv_file_path))
                {
                    csvReader.SetDelimiters(new string[] { "," });
                    csvReader.HasFieldsEnclosedInQuotes = true;
                    string[] colFields = csvReader.ReadFields();
                    foreach (string column in colFields)
                    {
                        DataColumn datecolumn = new DataColumn(column);
                        datecolumn.AllowDBNull = true;
                        csvData.Columns.Add(datecolumn);
                    }
                    while (!csvReader.EndOfData)
                    {
                        string[] fieldData = csvReader.ReadFields();
                        //Making empty value as null
                        for (int i = 0; i < fieldData.Length; i++)
                        {
                            if (fieldData[i] == "")
                            {
                                fieldData[i] = null;
                            }
                        }
                        csvData.Rows.Add(fieldData);
                    }
                }
            }
            catch (Exception ex)
            {
                return null;
            }
            return csvData;
        }


        static void InsertDataIntoSQLServerUsingSQLBulkCopy(DataTable csvFileData)
        {
            using (SqlConnection dbConnection = new SqlConnection("Data Source=localhost;Initial Catalog=Database_Name;Integrated Security=SSPI;"))
            {
                dbConnection.Open();
                using (SqlBulkCopy s = new SqlBulkCopy(dbConnection))
                {
                    s.DestinationTableName = "TableName";
                    //foreach (var column in csvFileData.Columns)
                        //s.ColumnMappings.Add(column.ToString(), column.ToString());
                    s.WriteToServer(csvFileData);
                }
            }
        }
    }
}

Ответы [ 2 ]

1 голос
/ 11 октября 2019

Я предполагаю, что -

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

b. Вы знаете, заранее, индекс нуля столбца, который нужно пропустить.

С этим, вот три способа, которые вам нужно сделать.

  1. Добавитьпеременная для хранения индекса для пропуска
string csv_file_path = @"pathToCsvFile";
//Assuming just one index for the column number to skip - zero based counting. 
//perhaps read from the AppConfig
int columnIndexToSkip = 0;
DataTable csvData = GetDataTabletFromCSVFile(csv_file_path, columnIndexToSkip);
Изменить сигнатуру функции для получения дополнительного параметра int
        private static DataTable GetDataTabletFromCSVFile(string csv_file_path, int columnIndexToSkip)
        {
Добавить фиктивный столбец с этим индексом
                            csvData.Rows.Add(fieldData);
                        }
                    }// end of while (!csvReader.EndOfData) loop

                    if (columnIndexToSkip >= 0)
                    {
                        csvData.Columns.Add("DUMMY").SetOrdinal(columnIndexToSkip);
                    }

Я не проверял импорт, но обновленный файл CSV выглядит хорошо для меня.

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