.csv文件按逗号分割,非简单的split分割
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 } } } } } }
————————————————
版权声明:本文为「cilves」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。