Excel VBA将csv字符串处理成数组

时间:2012-10-12 22:24:11

标签: excel vba csv split

我有通过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 - 从shell打开(双击 - 没有额外选项) enter image description here

2 个答案:

答案 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)

我可以想到三种可能性:

  1. 使用正则表达式处理文本。 SO上有很多例子,谷歌可以通过谷歌来分隔这样的字符串。
  2. 使用Excel的强大功能:将文本保存到临时文件,打开临时表并从表格中读取数据。完成后删除文件和表格。
  3. 使用ADO查询数据。将字符串保存到临时文件并对其运行查询以返回所需的字段。
  4. 为了提供更具体的建议,我需要输入数据和预期输出的样本