簡體   English   中英

在C#中讀取CSV文件並存儲在DataTable中

[英]Read CSV file in C# and store in DataTable

我正在使用以下代碼讀取csv文件並將其存儲在C#中。 但是我的要求是,我想跳過csv文件中的第一行,因為它不是結構化的,因此將第二行作為列。 如何在現有代碼中執行此操作。

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 csvData;
}

我的CSV文件看起來像

a;;{b;g;t{}
firstname;lastname;age;locaion
peter;vela;28;denver
sasi;kiran;38;colorado
sastri;miro;texas

TextFieldParser類具有可以接收流的構造函數。
因此,想法是:在文件上打開一個StreamReader,讀取第一行並丟棄它,然后使用打開的StreamReader(位於您的列名稱所在的第二行)構建TextFieldParser。

我已經測試過了,它似乎有效

using (StreamReader reader = new StreamReader(csv_file_path))
{
    // Discard the first line... (add checking here)
    reader.ReadLine();
    using(TextFieldParser csvReader = new TextFieldParser(reader))
    {
       csvReader.SetDelimiters(new string[] { ";" });
       .....

我還根據您的示例數據將定界符設置為分號而不是逗號。

這應該工作:

int rowsToSkip = 1;
int position = 0;
while (!csvReader.EndOfData)
{
    string[] fieldData = csvReader.ReadFields();
    if(position >= rowsToSkip)
    {

        //Making empty value as null
        for (int i = 0; i < fieldData.Length; i++)
        {
            if (fieldData[i] == "")
            {
                fieldData[i] = null;
            }
        }
        csvData.Rows.Add(fieldData);
    }
    position++;
}

如果您想讓自己的生活變得輕松,並准備花一些錢。 Flexcel將使您的生活變得輕松。

這件事將用兩行代碼來完成。

謝謝

暫無
暫無

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

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