VB.NET读取CSV文件时如何过滤仅含分隔逗号的空白行
问题背景
现有用于读取列数不固定的CSV文件的代码如下,当用户通过Excel打开CSV并删除其中某一行后,被删除的行在读取时会变为仅含逗号分隔的空白/全空格内容(例如,,形式的字符串),这类无效内容会被加入DataTable成为空白行,需要实现自动跳过这类行的逻辑。
Dim sreader As StreamReader Dim sstring As String Dim dt As DataTable Dim counter as Integer sreader = File.OpenText(Path.ToString) ' 该路径为CSV文件存储路径 While sreader.Peek <> -1 sstring = sreader.Readline() If sstring <> " " then ' 此处如何判断字符串除了分隔逗号外不存在任何有效内容 Dim str As String () = sstring.Split(",") Dim rowdt As DataRow rowdt = dt.NewRow() For i As Integer = 0 To dt.Columns.count-1 rowdt(i) = str(i).ToString() Next dt.rows.Add(rowdt) End if Counter = counter + 1 End While
原有尝试方案
原尝试核心逻辑为统计拆分后空字段的数量,存在硬编码列数3、重复调用Split、语法多写End If的问题,无法适配列数不固定的场景:
Dim sreader As StreamReader Dim counter as Integer Dim sstring As String Dim dt As DataTable sreader = File.OpenText(Path.ToString) While sreader.Peek <> -1 sstring = sreader.Readline() Dim no as integer = 0 For each str as String in sstring.Split(",") If str.ToString.Trim = "" then no = no + 1 End If Next If no <> 3 then Dim str As String () = sstring.Split(",") Dim rowdt As DataRow rowdt = dt.NewRow() For i As Integer = 0 To dt.Columns.count-1 rowdt(i) = str(i).ToString() Next dt.rows.Add(rowdt) End if End if counter = counter + 1 End While
优化后兼容方案
优化点说明:
- 移除硬编码的列数判断,自动适配任意列数的CSV文件
- 仅调用一次Split方法,减少不必要的性能消耗
- 额外兼容整行全为空白字符、CSV列数少于DataTable列数的极端边界情况
- 修复原有代码的语法错误
' 若提示All方法不存在,可在文件顶部加 Imports System.Linq Dim sreader As StreamReader Dim sstring As String Dim dt As DataTable Dim counter As Integer sreader = File.OpenText(Path.ToString) ' 该路径为CSV文件存储路径 While sreader.Peek <> -1 sstring = sreader.ReadLine() ' 先过滤整行全空白的情况 If String.IsNullOrWhiteSpace(sstring) Then Continue While End If Dim strArr As String() = sstring.Split(",") ' 判断是否所有字段Trim后都为空 Dim allEmpty As Boolean = strArr.All(Function(s) String.IsNullOrWhiteSpace(s)) ' 只要不是全空行就写入DataTable If Not allEmpty Then Dim rowdt As DataRow = dt.NewRow() For i As Integer = 0 To dt.Columns.Count - 1 rowdt(i) = If(i < strArr.Length, strArr(i).Trim(), String.Empty) Next dt.Rows.Add(rowdt) End If counter = counter + 1 End While
内容的提问来源于stack exchange,提问作者Muriel Mi
相关产品推荐
相关产品推荐

