1、csv文件各列默認是以英文逗號(,)來分割的。但是在實際中,數據中也會有包含英文逗號,Windows在保存這類的數據時會把含有逗號的數據當做字符串保存,在兩端會加上雙引號。此時如果簡單的用英文逗號做split,讀出來的數據完全不是想要的。(在確保數據中不包含特殊字符的情況下可以用split)
2、ADO、OLEDB讀取CSV文件
這種可以很快讀取數據,也可以避免1中的問題。
但是出現了另外一種情況,ISAM機制會自動判斷各列的數據類型(詳細參閱https://www.douban.com/note/18510346/)。此時,如果實際數據類型與判斷出來的數據類型不匹配的話,系統會用NULL替換,造成數據的丟失。
注:在讀取EXCEL文件的時候,可以設 IMEX=1 ,此時會把所有列作為文本讀取,但是CSV中該參數沒用。
簡單示例(OLEDB):
' 讀取csv到Datatable Dim Source_Path As String Dim File_name As String = File_FullName.Split("\")(UBound(File_FullName.Split("\"))) Source_Path = File_FullName.Replace(File_name, "") Try Dim connectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Source_Path & ";Extended Properties=""text;HDR=Yes;FMT=Delimited""" Dim conn As New OleDbConnection(connectionString) conn.Open() Dim cmdSelect As OleDbDataAdapter cmdSelect = New OleDbDataAdapter("select * from " & "[" & File_name & "]", conn) Dim dt As DataTable = New DataTable() cmdSelect.Fill(dt) conn.Close() Return dt Catch ex As Exception Debug.Print(ex.ToString) Return False End Try
C#
//需要先添加Microsoft.VisualBasic的引用 using Microsoft.VisualBasic.FileIO; namespace ConsoleApp1 { class Program { static void Main(string[] args) { using (TextFieldParser parser = new TextFieldParser(@"c:\temp\test.csv")) { parser.TextFieldType = FieldType.Delimited; parser.SetDelimiters(","); while (!parser.EndOfData) { //Processing row string[] fields = parser.ReadFields(); foreach (string field in fields) { //TODO: Process field } } } } } }
————————————————
版權聲明:本文為CSDN博主「cilves」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/hancluo/article/details/86590732