簡體   English   中英

在 C# 中將 CSV 導出到 SQL - 如何將導出偏移一列

[英]Exporting CSV to SQL in C# - how to offset the export by one column

我正在使用 C# 解析 csv 文件並導出到 SQL 服務器數據庫表。 數據庫表的架構幾乎與 csv 文件的架構相同,不同之處在於該表有一個主鍵標識列作為第一列。

問題:數據庫表的第二列,應該接收 csv 文件的第一列,實際上是接收 csv 文件的第二列。 該代碼假設數據庫表的第一個 PK Identity 列是要從 CSV 文件寫入的第一列。 萬一這令人困惑,假設 CSV 文件的第 1、2 和 3 列分別具有名為Contoso1Contoso2Contoso3的標題。 數據庫表的 1 到 4 列分別稱為IdContoso1Contoso2Contoso3 在導出過程中, Id列正確地填充了標識 ID,但隨后數據庫表的Contoso1列填充了 CSV 文件的Contoso2列,並且所有 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);
                }
            }
        }
    }
}

我在這里問了一個類似的問題How to import data from.csv 具有不同列標題的文本文件到 memory 是我的代碼。

我假設-

一個。 只有一列需要跳過,但可以修改為添加多列跳過

灣。 你知道,提前,要跳過的列的從零開始的索引。

除此之外,這里是您需要進行的 3 項修改。

  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);
  1. 修改 function 簽名,取額外的 int 參數
        private static DataTable GetDataTabletFromCSVFile(string csv_file_path, int columnIndexToSkip)
        {
  1. 在該索引處添加虛擬列
                            csvData.Rows.Add(fieldData);
                        }
                    }// end of while (!csvReader.EndOfData) loop

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

我沒有測試導入,但更新后的 csv 文件對我來說看起來不錯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM