Создание таблицы данных из файла CSV - PullRequest
7 голосов
/ 22 июля 2010

Я работаю над проектом, и мне нужно прочитать файл CSV, а затем заполнить DataSet его данными.Я искал и нашел некоторые интересные вещи в OleDB.

У меня есть класс CSVReader:

class CSVReader
{
    public DataTable GetDataTable(string filePath)
    {
        OleDbConnection conn = new System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0; Data Source = " + Path.GetDirectoryName(filePath) + "; Extended Properties = \"Text;HDR=YES;FMT=Delimited\"");
        conn.Open();
        string strQuery = "SELECT * FROM [" + Path.GetFileName(filePath) + "]";
        OleDbDataAdapter adapter = new OleDbDataAdapter(strQuery, conn);
        DataSet ds = new System.Data.DataSet("CSV File");
        adapter.Fill(ds);
        return ds.Tables[0];
    }
}

И я вызываю его отсюда:

CSVReader datareader = new CSVReader();
DataTable dt = datareader.GetDataTable(filepath);

Проблема в том, что он анализирует первую строку (строку заголовка) как и просто идентификатор для столбца, я имею в виду: это заголовок файла CSV:

Name, Product Name, Server, Vendor, Start Time, End Time, Host Name, User Name, Project Name, Usage time (hours)

И после него все данные разделены запятыми.

Когда я читаю файл, заполняю набор данных и печатаю dt.Columns.Count , это показывает, что он имеет только 1 столбец.

Любая помощь?

Заранее спасибо.

Ответы [ 5 ]

7 голосов
/ 22 июля 2010

Я всегда использую эту библиотеку CSV для чтения файлов CSV через C #, она всегда работала хорошо для меня.

http://www.codeproject.com/KB/database/CsvReader.aspx

Вот пример чтения файла CSF с использованием библиотеки

using System.IO;
using LumenWorks.Framework.IO.Csv;

void ReadCsv()
{
    // open the file "data.csv" which is a CSV file with headers
    using (CsvReader csv =
           new CsvReader(new StreamReader("data.csv"), true))
    {
        int fieldCount = csv.FieldCount;
        string[] headers = csv.GetFieldHeaders();

        while (csv.ReadNextRecord())
        {
            for (int i = 0; i < fieldCount; i++)
                Console.Write(string.Format("{0} = {1};",
                              headers[i], csv[i]));

            Console.WriteLine();
        }
    }
}
6 голосов
/ 12 февраля 2013

Лучший вариант, который я нашел, и он решает проблемы, когда у вас могут быть установлены разные версии Office, а также 32/64-битные проблемы, это FileHelpers .

Можетбыть добавлены к ссылкам на ваш проект с помощью NuGet, и это обеспечивает решение с одним вкладышем:

CommonEngine.CsvToDataTable(path, "ImportRecord", ',', true);
2 голосов
/ 22 июля 2010

KBCsv имеет встроенную поддержку для чтения в DataSet:

using (var reader = new CsvReader(@"C:\data.csv")) {
    reader.ReadHeaderRecord();
    var dataSet = new DataSet();
    reader.Fill(dataSet, "csv-data");
}
1 голос
/ 22 июля 2010

если ничего особенного, я использую такой код

TextReader tr1 = new StreamReader(@"c:\pathtofile\filename",true);

var Data = tr1.ReadToEnd().Split('\n')
.Where(l=>l.Length>0)  //nonempty strings
.Skip(1)               // skip header 
.Select(s=>s.Trim())   // delete whitespace
.Select(l=>l.Split(',')) // get arrays of values
.Select(l=>new {Field1=l[0],Field2=l[1],Field3=l[2]});
0 голосов
/ 22 июля 2010

Попробуйте включить IMEX в расширенные свойства, которые сообщат драйверу, что у вас есть данные смешанного режима

Text;HDR=YES;FMT=Delimited;IMEX=1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...