以文本方式查看主题 - 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 输出的结果没有问题了: |