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

如何将单行CSV文件导入多行DataGridView?

解决单行CSV导入DataGridView的问题

我懂你的困扰——从JPL拿到的这个CSV居然把所有小行星数据挤在一行里,常规的逐行读取代码完全派不上用场!不过咱们可以抓准一个关键特征:每个小行星条目都是以(2006 QQ23)这类带括号的名称开头的,用这个就能把单行内容拆成正常的多行,再顺利导入DataGridView。

基础解决方案(适用于无引号包裹的简单CSV)

先上最直接的VB.NET代码,利用正则拆分条目:

Imports System.Text.RegularExpressions

' 读取单行CSV的全部内容
Dim csvFullContent As String = System.IO.File.ReadAllText("\test.csv")

' 正则匹配:抓取所有以(开头的小行星条目,直到下一个(或文本结束
Dim entryPattern As String = "\(.*?(?=\(|$)"
Dim asteroidEntries As MatchCollection = Regex.Matches(csvFullContent, entryPattern)

' 清空DataGridView原有数据(按需选择)
DataGridView1.Rows.Clear()

' 遍历每个拆分出的条目,导入表格
For Each entry As Match In asteroidEntries
    ' 去除条目首尾可能存在的空格
    Dim singleLineData As String = entry.Value.Trim()
    ' 按逗号拆分列数据
    Dim columnValues As String() = singleLineData.Split(","c)
    ' 添加到DataGridView
    DataGridView1.Rows.Add(columnValues)
Next

进阶解决方案(处理带引号包裹的CSV字段)

如果CSV里有带逗号的字段(比如被双引号包裹的内容),上面的Split方法会把逗号当成分隔符,导致列数错乱。这时候用TextFieldParser来解析更靠谱:

Imports System.Text.RegularExpressions
Imports Microsoft.VisualBasic.FileIO
Imports System.IO

' 读取单行CSV内容
Dim csvFullContent As String = System.IO.File.ReadAllText("\test.csv")

' 拆分小行星条目
Dim entryPattern As String = "\(.*?(?=\(|$)"
Dim asteroidEntries As MatchCollection = Regex.Matches(csvFullContent, entryPattern)

DataGridView1.Rows.Clear()

For Each entry As Match In asteroidEntries
    Dim singleLineData As String = entry.Value.Trim()
    ' 使用TextFieldParser处理带引号的CSV字段
    Using parser As New TextFieldParser(New StringReader(singleLineData))
        parser.TextFieldType = FieldType.Delimited
        parser.SetDelimiters(",")
        parser.HasFieldsEnclosedInQuotes = True ' 开启引号字段识别
        Dim columnValues As String() = parser.ReadFields()
        ' 确保读取到有效数据再添加
        If columnValues IsNot Nothing Then
            DataGridView1.Rows.Add(columnValues)
        End If
    End Using
Next

原理说明

JPL这个API返回的CSV格式比较特殊,它把所有小行星的记录拼接成了单行,但每个记录的开头都是(小行星编号)格式。我们用的正则\(.*?(?=\(|$)就是精准定位每个记录:

  • \(:匹配开头的左括号
  • .*?:非贪婪匹配任意字符(避免把多个条目当成一个)
  • (?=\(|$):正向预查,匹配到下一个左括号或者文本结尾就停止,这样刚好拆分出单个小行星的完整数据行。

内容的提问来源于stack exchange,提问作者Erik Von Weishaar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:44:23