.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版权协议,转载请附上原文出处链接及本声明。