Итак, это началось как довольно простая задача для импорта данных клиентов в нашу базу данных. Скрипт ниже загружает все данные в память, а затем разрешает манипуляции после.Импорт данных из 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?
Просто FYI ... CSVReader, в отличии от LINQ к CSV, требует, чтобы вы конвертировали каждое прочитанное вами значение. LINQ to CSV позволяет вам определять конкретные классы, представляющие строки в CSV-файле, с автоматическим преобразованием типов каждого значения в свойство. – jrista