3

我有通过 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

显然,这不能处理包含特殊标记的字段。

解析这些数据的可靠方法是什么?

谢谢

编辑 13/10/2012 数据样本

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 - 从外壳打开(双击 - 没有额外选项) 在此处输入图像描述

4

2 回答 2

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
于 2012-10-13T00:24:46.090 回答
1

我能想到三种可能:

  1. 使用正则表达式处理文本。在 SO 和谷歌上有很多例子可以用来分隔这样的字符串。
  2. 使用 Excel 的强大功能:将文本保存到临时文件中,打开临时表并从表中读取数据。完成后删除文件和工作表。
  3. 使用 ADO 查询数据。将字符串保存到临时文件并对其运行查询以返回所需的字段。

为了提供更具体的建议,我需要输入数据和预期输出的样本

于 2012-10-13T02:41:24.520 回答