2010-07-14 3 views
0

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

string ConString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\"" + FileLoc + "\"; Extended Properties=\"text;HDR=Yes;FMT=Delimited(,)\""; 

using (OleDbConnection conn = new OleDbConnection(ConString)) 
{ 
    using (OleDbCommand cmd = new OleDbCommand("SELECT * FROM DataInput.csv", conn)) 
    { 
     conn.Open(); 

     using (OleDbDataReader dr = cmd.ExecuteReader(CommandBehavior.SequentialAccess)) 
     { 
      int RowNumber = 0; 
      while (dr.Read()) 
      { 


       if(RowNumber==0) 
       { 
        for (int i = 0; i < dr.FieldCount; i++) 
        { 
         TitleData.Add(new CSVTitleData() {ColumnID = i,ColumnName = dr.GetValue(i).ToString()}); 
        } 
       } 
       else 
       { 
        var DataToInsert = new List<CSVData>(); 
        for (int i = 0; i < dr.FieldCount; i++) 
        { 
         if (i == 8) 
         { 
          var A = dr.GetValue(i); 
          Console.WriteLine(A.GetType().ToString() + " - " + i); 
         } 
         DataToInsert.Add(new CSVData(){ColumnID = i,Value = dr.GetValue(i).ToString()}); 
        } 

        Content.Add(DataToInsert); 
       } 
       RowNumber++; 
      } 
     } 
    } 
} 

Это прекрасно работает до тех пор, пока данные, как

4950 
4951 
4952 
4998 
2024 
4176 
7025-1 
RVAC010 
RVAC011 
4945 
4946 
4947 
4948 

Excel пытается быть умным и читает каждое из полей в качестве Int. Результирующие int - те, у которых буквы читаются как DBNull.

Теперь я сделал некоторое чтение, и есть много людей с этим вопросом, но нет твердого решения. Одним из возможных решений является создание Scheme.ini. Интересно, может ли кто-нибудь помочь мне в точном формате?

Или, может быть, легче было читать в CSV?

ответ

4

У меня был такой же опыт с этим .... я нашел фантастическую библиотеку в CodeProject для чтения CSV файлов:

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

библиотеке обрабатывает все такие как парсинг томами CSV правильно, поэтому вам не нужно беспокоиться о таких проблемах. Он очень прост в использовании и данные могут быть возвращены с помощью DataTable.

Это стало неотъемлемой частью моей библиотеки кода. Я настоятельно рекомендую вам проверить это.

+0

Просто FYI ... CSVReader, в отличии от LINQ к CSV, требует, чтобы вы конвертировали каждое прочитанное вами значение. LINQ to CSV позволяет вам определять конкретные классы, представляющие строки в CSV-файле, с автоматическим преобразованием типов каждого значения в свойство. – jrista

2

Я бы рекомендовал канаву Excel и использовать что-то по линиям LINQ to CSV для обработки вашей обработки. Вы исключили бы зависимость от Excel, имели бы прямой контроль над набором и более легкий вес для загрузки.

http://www.codeproject.com/KB/linq/LINQtoCSV.aspx

1

Мой любимый метод для чтения файлов является использование внешней библиотеки http://www.filehelpers.com/

Описание:
The FileHelpers является бесплатной и простой в использовании библиотеки .NET для импорта/экспорта данных с фиксированной длиной или разделителями записи в файлах, строках или потоках.

В нем есть все и кухонная раковина и еще маленькие ..

Запуска первенствовать никогда не является хорошей идеей в приложении asp.net и солидарный запрещено Microsoft.

Вы всегда можете попытаться ODBC, который имеет возможность определить расположение с INI-файлами для майкрософт единственного решения, хотя дни ODBC пронумерованы

+0

+1 Это отличная ссылка, которую вы нашли! – Dal

Смежные вопросы