You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 12:24:04