如何将单行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
相关产品推荐
相关产品推荐

