Foxtable(狐表)用户栏目专家坐堂 → 关于csv文件导入,正则表达式解析错误的情况


  共有2661人关注过本帖树形打印复制链接

主题:关于csv文件导入,正则表达式解析错误的情况

帅哥哟,离线,有人找我吗?
teng0731
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:459 积分:3471 威望:0 精华:0 注册:2011/6/6 11:22:00
关于csv文件导入,正则表达式解析错误的情况  发帖心情 Post By:2024/1/2 21:40:00 [只看该作者]

 使用下面的代码来导入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), "(?<="").+?(?="")|(?<=,|^)[^""]*?(?=,|$)")   进行优化。


 回到顶部
帅哥,在线噢!
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110810 积分:563988 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2024/1/2 21:58:00 [只看该作者]

这个正则想实现什么功能?

 回到顶部
帅哥哟,离线,有人找我吗?
teng0731
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:459 积分:3471 威望:0 精华:0 注册:2011/6/6 11:22:00
  发帖心情 Post By: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编辑过]

 回到顶部
帅哥,在线噢!
有点蓝
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110810 积分:563988 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By: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
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:459 积分:3471 威望:0 精华:0 注册:2011/6/6 11:22:00
  发帖心情 Post By:2024/1/3 9:06:00 [只看该作者]

使用正则是因为,记录字段中本身含有逗号的情况存在,比如爱好可能的值是“篮球,羽毛球,乒乓球”,如果使用Dim cs() As String = rs(i).Split(","),会出现错误的分割

比如下图的情况:

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

 回到顶部
帅哥,在线噢!
有点蓝
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110810 积分:563988 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2024/1/3 9:24:00 [只看该作者]

帮助里的
Dim cs() As String = rs(i).Split(vbtab)
改为
Dim cs() As String = rs(i).trim("""").Replace(""",""", "|").Split("|") '如果数据里会有"|"符号。就改为其它不会有的符号即可

 回到顶部
客人(111.8.*.*)
  7楼


  发帖心情 Post By: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
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:459 积分:3471 威望:0 精华:0 注册:2011/6/6 11:22:00
  发帖心情 Post By: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

输出的结果没有问题了:

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

 回到顶部