簡體   English   中英

使用oledb導入Csv文件-不讀取“ 1.2.3.4”值

[英]Importing Csv file using oledb - not reading “1.2.3.4” value

我想使用oledb連接到c#將csv文件導入數據庫。 我的csv文件有9列,其中一列是“版本號”,其值為“ 1.2.3.4”,當我將csv文件數據加載到數據表中時,它將此值轉換為“ 1.234”。 我希望將“ 1.2.3.4”值保存到數據庫中。 我試圖將列數據類型更改為將文本轉換為csv,但仍將其轉換。 需要這個建議,我該如何解決。

 OleDbConnectionStringBuilder connectionString = new OleDbConnectionStringBuilder();
        connectionString.Provider = "Microsoft.ACE.OLEDB.12.0";
        if (extension == ".csv")
        {
            connectionString["Extended Properties"] = "text;HDR=Yes;";
            connectionString.DataSource = Path.GetDirectoryName(fileName);
            tableName = Path.GetFileName(fileName);
        }
        else
            if (extension == ".xls")
            {
                connectionString["Extended Properties"] = "Excel 8.0;HDR=Yes;IMEX=1";
                connectionString.DataSource = fileName;
            }
            else
                if (extension == ".xlsx")
                {
                    connectionString["Extended Properties"] = "Excel 12.0 Xml;HDR=YES";
                    connectionString.DataSource = fileName;
                }
OleDbDataAdapter oleda = new OleDbDataAdapter("select * from [{1}]", fileName), 
                   connectionString.ToString());
DataTable dtbCSV = new DataTable();
oleda.Fill(dtbCSV);

CSV文件數據:

Name                    Policy Category VersionName        ReleaseDate  Description                      DownloadType   Version     FileUrl
What's_New_Release_8.1  Trial       What's_New_Release_8.1  9/1/2016    This is the Description for Downloads   Sku      1.1        https://google.com/image/temp.png
Release 7 0 What's New  Trial       Release 7 0 What's New  10/5/2016   This is the Description for Downloads   Sku      1.23.41.2  http://google.com/image/temp.png

Schema.ini文件:

[6770aedf-e6b7-44de-afbf-8380f5c450ca.csv] 
 ColNameHeader=True 
 Format=CSVDelimited 
 Col1=Name Text Width 500 
 Col2=Policy Text Width 1000
 Col3=Category Text Width 1000 
 Col4=VersionName Text Width 1000
 Col5=ReleaseDate DateTime
 Col6=Description Text Width 1000
 Col7=DownloadType Text Width 1000
 Col8=Version DateTime
 Col9=FileUrl Text Width 1000

這是我的schema.ini,它位於我保存csv文件的temp文件夾中

提前致謝,

好吧,首先,我假設您的csv文件是制表符分隔的。 您需要為OleDb指定列類型以正確解析它。 我認為最好的方法是使用schema.ini文件,該文件必須與csv文件所在的路徑相同。這是其外觀的一個示例:

[test.csv]
Format=TabDelimited
ColNameHeader=false
MaxScanRows=0
Col1=Name Text
Col2=Policy Text
Col3=VersionName Text
Col4=ReleaseDate Text
Col5=Description Text
Col6=DownloadType Text
Col7=Version Text
Col8=FileUrl Text

如您所見,您必須在第一行中指定csv文件名。 然后,將定界符設置為制表符。 之后,我取消激活第一行是標題行(這將導致您刪除csv中的第一行)。 之后,您必須使用預期的類型定義所有列。

希望這可以幫助。

@Pikoh已經解釋了如何使用schema.ini文件來控制驅動程序處理每個字段的人員。

另一種選擇是使用像庫CsvHelper讀取 CSV數據直接映射到對象,例如:

var csv = new CsvReader( textReader );
IEnumerable<MyClass> records = csv.GetRecords<MyClass>();

GetRecords返回一個IEnumerable,這意味着行被延遲加載, 並且您可以使用LINQ對其進行過濾或僅加載特定字段:

var records = from record in csv.GetRecords<MyClass>()
              where record.ReleseDate > new DateTime(2016,09,01)
              select new {record.Name};

可以自動映射字段,也可以使用流暢的界面指定自己的映射。 映射類還允許您指定本地化選項,例如處理MM/DD/YYYYDD/MM/YYYY格式:

public sealed class MyClassMap : CsvClassMap<MyClass>
{
    public MyClassMap()
    {
        Map( m => m.Description ).Index( 0 )
                           .TypeConverterOption( CultureInfo.InvariantCulture );
        Map( m => m.TimeStamp ).Index( 1 )
                          .TypeConverterOption( DateTimeStyles.AdjustToUniversal );
        Map( m => m.Cost ).Index( 2 )
                          .TypeConverterOption( NumberStyles.Currency );
        Map( m => m.CurrencyFormat ).Index( 3 )
                          .TypeConverterOption( "C" );
        Map( m => m.BooleanValue ).Index( 4 )
                          .TypeConverterOption( true, "sure" )
                          .TypeConverterOption( false, "nope" );
    }
}

最后,避免了安裝正確的OLEDB驅動程序(x86或x64)的麻煩。

暫無
暫無

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

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