以文本方式查看主题

-  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=189883)

--  作者:teng0731
--  发布时间:2024/1/2 21:40:00
--  关于csv文件导入,正则表达式解析错误的情况
 使用下面的代码来导入csv文件的数据,先讲csv文件后缀名改为txt:

Dim dlg As new OpenFileDialog
dlg.Filter = "文本文件|*.txt"
If dlg.ShowDialog = DialogResult.OK Then
    Dim strs As String = FileSys.ReadAllText(dlg.FileName,encoding.default)
    strs = strs.Replace(vblf,"")
    Dim rs() As String = strs.Split(vbcr)    
    Dim cs As New List(Of String)
    Dim mc = System.Text.RegularExpressions.Regex.Matches(rs(6), "(?<="").+?(?="")|(?<=,|^)[^""]*?(?=,|$)")
    For j As Integer = 0 To mc.count-1
        output.show(mc(j).value.trim(","))
    Next
End If

图片点击可在新窗口打开查看

但是对于第二行记录中,数据为空的,在解析时,无法正常作为一个空值来对应到相应的字段,比如年龄和工龄,请蓝版对Dim mc = System.Text.RegularExpressions.Regex.Matches(rs(6), "(?<="").+?(?="")|(?<=,|^)[^""]*?(?=,|$)")   进行优化。


--  作者:有点蓝
--  发布时间:2024/1/2 21:58:00
--  
这个正则想实现什么功能?
--  作者:teng0731
--  发布时间:2024/1/3 8:56:00
--  
 蓝版上面的正则表达式是您之前回答其他用户关于csv文件导入时,您提供的,我只是参考,直接拿过来使用,在实际使用的过程中,发现对于值为空的数据,输出的情况不正常,比如下面的数据:
图片点击可在新窗口打开查看

使用如下的语句进行读取后,结果有问题:

Dim dlg As New OpenFileDialog
dlg.Filter = "文本文件|*.txt"
If dlg.ShowDialog = DialogResult.OK Then
    Dim strs As String = FileSys.ReadAllText(dlg.FileName, encoding.default)
    strs = strs.Replace(vblf, "")
    Dim rs() As String = strs.Split(vbcr)
    For i As Integer = 1 To rs.Length - 1
        Dim cs As New List(Of String)
        Dim mc = System.Text.RegularExpressions.Regex.Matches(rs(i), "(?<="").+?(?="")|(?<=,|^)[^""]*?(?=,|$)")
        For j As Integer = 0 To mc.count - 1 Step 2
            output.show(mc(j).value.trim(","))
        Next
    Next
End If

上面语句运行后:

图片点击可在新窗口打开查看

对于张三的输出是正确的,但对于李四的输出就错了,一是出现了一个" 符号,另外也少了一行,我想要的原文本文件中李四的年龄和工龄为空值,那么在这里输出的应该也是两个空值。
[此贴子已经被作者于2024/1/3 8:57:32编辑过]

--  作者:有点蓝
--  发布时间:2024/1/3 9:01:00
--  
完全没有印象。3楼这种数据直接按逗号分隔取值即可,类似:http://www.foxtable.com/webhelp/topics/2629.htm,没有必要使用什么正则

帮助里的
Dim cs() As String = rs(i).Split(vbtab)
改为
Dim cs() As String = rs(i).Split(",")

--  作者:teng0731
--  发布时间:2024/1/3 9:06:00
--  
使用正则是因为,记录字段中本身含有逗号的情况存在,比如爱好可能的值是“篮球,羽毛球,乒乓球”,如果使用Dim cs() As String = rs(i).Split(","),会出现错误的分割

比如下图的情况:

图片点击可在新窗口打开查看
[此贴子已经被作者于2024/1/3 9:15:02编辑过]

--  作者:有点蓝
--  发布时间:2024/1/3 9:24:00
--  
帮助里的
Dim cs() As String = rs(i).Split(vbtab)
改为
Dim cs() As String = rs(i).trim("""").Replace(""",""", "|").Split("|") \'如果数据里会有"|"符号。就改为其它不会有的符号即可

--  作者:客人
--  发布时间:2024/1/3 9:35:00
--  
 使用"|"符号等还是不保险,因为客户的数据千奇百怪,还是使用下面的方式来做:
Dim dlg As New OpenFileDialog
dlg.Filter = "文本文件|*.txt"
If dlg.ShowDialog = DialogResult.OK Then
    Dim strs As String = FileSys.ReadAllText(dlg.FileName, encoding.default)
    strs = strs.Replace(vblf, "")
    Dim rs() As String = strs.Split(vbcr)
    For i As Integer = 1 To rs.Length - 1
        Dim cs() As String = rs(i).Split(""",""")
        For j As Integer = 1 To cs.Length - 1 Step 2
            output.show("记录: " & cs(j).trim(","))
        Next
    Next
End If

输出的结果没有问题了:

图片点击可在新窗口打开查看

--  作者:teng0731
--  发布时间:2024/1/3 9:37:00
--  
 使用"|"符号等还是不保险,因为客户的数据千奇百怪,还是使用下面的方式来做:

Dim dlg As New OpenFileDialog
dlg.Filter = "文本文件|*.txt"
If dlg.ShowDialog = DialogResult.OK Then
    Dim strs As String = FileSys.ReadAllText(dlg.FileName, encoding.default)
    strs = strs.Replace(vblf, "")
    Dim rs() As String = strs.Split(vbcr)
    For i As Integer = 1 To rs.Length - 1
        Dim cs() As String = rs(i).Split(""",""")
        For j As Integer = 1 To cs.Length - 1 Step 2
            output.show("记录: " & cs(j).trim(","))
        Next
    Next
End If

输出的结果没有问题了:

图片点击可在新窗口打开查看