我有通过http下载获得的csv字符串(utf-8)。
根据情况,字符串中的数据可能包含不同数量的列,但每次处理字符串时,它将包含相同数量的列并且是连续的。 (数据是均匀的。)
字符串可以包含任意数量的行。
第一行始终是标题。
字符串字段将用双引号括起来,可以包含逗号,引号和换行符。
字符串中的引号和双引号通过加倍转换为“”和“
来转义换句话说,这是一个格式良好的csv格式。 Excel通过它的标准文件打开机制可以格式化这些数据。
但是我想避免保存到文件然后打开csv,因为我需要在某些情况下处理输出,甚至与工作表上的现有数据合并。
(通过编辑添加以下信息) Excel应用程序将分发到各个目的地,我想避免可能的潜在权限问题,似乎没有向磁盘写入是一个很好的方法
我在想类似下面的伪:
rows = split(csvString, vbCrLf) 'wont work due to newlines inside string fields?
FOREACH rows as row
fields = split(row, ',') 'wont work due to commas in string fields?
ENDFOR
显然,无法处理包含特殊标记的字段。
解析这些数据的有效方法是什么?
由于
csv会出现在记事本中(注意并非所有的换行符都是\ r \ n,有些可能是\ n)
LanguageID,AssetID,String,TypeID,Gender
3,50820,"A string of natural language",3,0
3,50819,"Complex text, with comma, "", '' and new line
all being valid",3,0
3,50818,"Some more language",3,0
Excel 2010中的相同csv - 从shell打开(双击 - 没有额外选项)
答案 0 :(得分:5)
如果您不介意将数据放入工作簿:您可以使用空白工作表,将数据添加到1列,然后调用TextToColumns。然后,如果您想要将数据作为数组返回,只需从工作表的UsedRange加载它。
'Dim myArray 'Uncomment line if storing data to array.
'Assumes cvsString is already defined
'Used Temp as sheet for processing
With Sheets("Temp")
.Cells.Delete
.Cells(1, 1) = cvsString
.Cells(1, 1).TextToColumns Destination:=Cells(1, 1), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
Semicolon:=False, Comma:=True, Space:=False, Other:=False
'myArray = .UsedRange 'Uncomment line if storing data to array
End With
答案 1 :(得分:1)
我可以想到三种可能性:
为了提供更具体的建议,我需要输入数据和预期输出的样本