以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  从CSV文件中读取数据,使用逗号','分割问题。  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=127266)

--  作者:wzl1990
--  发布时间:2018/11/9 15:43:00
--  从CSV文件中读取数据,使用逗号','分割问题。

 Dim dlg As New OpenFileDialog \'定义一个新的OpenFileDialog

 dlg.Filter= "Excel文件|*.csv" \'设置筛选器
        Dim strs As String = FileSys.ReadAllText(dlg.FileName, encoding.default)
        Dim rs() As String = strs.Split(chr(10))
        For i As Integer = 1 To rs.Length-2
            Dim s() As String = rs(i).Split(",")
            Dim nr As DataRow = DataTables("精简数据库").AddNew

             nr("根本死亡原因") = s(0)
             nr("根本死亡原因ICD编码") = s(1)
        Next

 

如上代码,当我导入csv格式读取数据的时候,那第一行来说,假如csv上s(0)=支气管或肺,未特指 s(1)=C34.9。因为,作为分隔符的问题,实际上导入的nr("根本死亡原因") =支气管或肺 nr("根本死亡原因ICD编码") =未特指。能否有办法对单元格内的,不分割。


--  作者:wzl1990
--  发布时间:2018/11/9 15:49:00
--  
直白一点的话就是

如果CSV某单元格的数据本身含有逗号,这里如何避免分隔出错?


--  作者:有点甜
--  发布时间:2018/11/9 15:50:00
--  
你csv文件发上来测试。
--  作者:wzl1990
--  发布时间:2018/11/9 15:57:00
--  上传文件
这个文件试一下
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:1-8月户籍死亡测试.zip


--  作者:有点甜
--  发布时间:2018/11/9 16:13:00
--  

1、你的文件看了一下,中间逗号是,和分割的逗号, 是不同的。

 

2、代码不影响你这个excel文件的数据的读取吧?如果影响,说明第几行有问题。


--  作者:wzl1990
--  发布时间:2018/11/9 16:18:00
--  
偶尔存在一些事用英文符号的,我用txt看了下,有英文符号,的都加了双引号,能否先对双引号进行判断。
csv文件存在错误的一行:1963/4/19,54岁,1,01 汉族,2,2 已婚,27,27 农民,7,7 初中及以下,本县区,河疃村,3207071600,,本县区,32070716065,河疃村,3207071600,河疃村,32070716065,河疃村,2018/4/5,3,3 家中,韩林,,河疃村,"脑梗死,未特指",I63.9,,,,,,,,,,,,,,,,,脑梗死,未特指,I63.9,2,2 二级医院,4,4 临床+理化,XXX,,2018/5/9,13754,卫生院,,,,,,,,,,,,,2018/5/9 14:45,XXX`26150,1,2018/5/16,,0,死亡卡,录入

--  作者:wzl1990
--  发布时间:2018/11/9 16:37:00
--  
传的文件倒数第三行就有问题:"未特指的机动车辆事故中的人员损伤,交通性",V89.2
--  作者:有点甜
--  发布时间:2018/11/9 16:47:00
--  

参考代码

 

Dim str As String = """脑梗死,未特指"",I63.9,""123,456789,123333"",abc"
Dim mc = System.Text.RegularExpressions.Regex.Matches(str, "(?<="").+?(?="")|(?<=,|^)[^""]*?(?=,|$)")
For i As Integer = 0 To mc.count-1
    msgbox(mc(i).value.trim(","))
Next


--  作者:有点甜
--  发布时间:2018/11/9 16:48:00
--  

参考

 

Dim dlg As New OpenFileDialog \'定义一个新的OpenFileDialog
dlg.Filter= "Excel文件|*.csv" \'设置筛选器
If dlg.ShowDialog = DialogResult.OK Then
    Dim strs As String = FileSys.ReadAllText(dlg.FileName, encoding.default)
    Dim rs() As String = strs.Split(chr(10))
    For i As Integer = 1 To rs.Length-2
        Dim mc = System.Text.RegularExpressions.Regex.Matches(rs(i), "(?<="").+?(?="")|(?<=,|^)[^""]*?(?=,|$)")
        For j As Integer = 0 To mc.count-1
            output.show(mc(j).value.trim(","))
        Next
        \'Dim nr As DataRow = DataTables("精简数据库").AddNew
        \'nr("根本死亡原因") = mc(0).value
        \'nr("根本死亡原因ICD编码") = mc(1).value
    Next
End If


--  作者:wzl1990
--  发布时间:2018/11/9 16:55:00
--  
OK,刚刚用了笨方法临时解决了下
Dim dlg As New OpenFileDialog \'定义一个新的OpenFileDialog
dlg.Filter= "Excel文件|*.csv" \'设置筛选器
If dlg.ShowDialog = DialogResult.Ok Then \'如果用户单击了确定按钮
    Dim strs As String = FileSys.ReadAllText(dlg.FileName, encoding.default)
    Dim rs() As String = strs.Split(chr(10))
    For i As Integer = 1 To rs.Length-2
        Dim s() As String = rs(i).Split(",")
        Dim nr As DataRow = DataTables("常规数据库").AddNew
        If s(0).Contains("""") Then         
        nr("根本死亡原因") = s(0).Remove(0,1) & s(1)
        nr("ICD编码") = s(2)    
        Else
        nr("根本死亡原因") = s(0)
        nr("ICD编码") = s(1)
        End If
    Next
End If

说实话,要的就是System.Text.RegularExpressions.Regex.Matches(rs(i), "(?<="").+?(?="")|(?<=,|^)[^""]*?(?=,|$)")这行代码,哈哈