【问题标题】:Handle comma in csv file: VBA处理csv文件中的逗号:VBA
【发布时间】:2017-11-12 07:17:34
【问题描述】:

我正在使用以下代码读取csv文件,最后将数据转换为数组。

Function Sample(strPath) As String()
    Dim MyData As String, strData() As String

    Open strPath For Binary As #1
    MyData = Space$(LOF(1))
    Get #1, , MyData
    Close #1
    Sample = Split(MyData, vbCrLf)
End Function

以下代码将每个逗号分隔的行转换为数组。

SaleRows = Sample(filepath)
For Each SaleRow In SaleRows
    SaleRowArray = Split(SaleRow, ",")
Next SaleRow

一切正常,但是当单元格包含逗号时,我上面的函数会失败。有没有办法处理特定单元格中的逗号?

CSV 示例

请注意第二行的逗号。

当我从逗号记录中获取数组时,我得到了下面。

【问题讨论】:

  • 请说明您实际上想要做什么。 Access 有很多方法可以处理 CSV 文件,手动解析它们并处理引号和引号转义(您没有这样做,这就是您收到此错误的原因)似乎是一件奇怪的事情。
  • 另外,如果您需要帮助解决您的错误,您应该告诉我们错误是什么。
  • 我添加了屏幕截图以获取更多详细信息。感谢您宝贵的时间,如果您需要更多信息,请告诉我。
  • 你的函数怎么失败了?它所做的只是将文本文件分成几行。它不会拆分单独的行....您真正要问的是什么?
  • 正如其他人已经说过的,代码只返回行,不显示将行拆分为离散数据元素。如果您的数据元素用逗号分隔,那么我不得不说不,代码无法区分应该保留为文字文本的逗号和表示分隔符的逗号。 , Inc 是文字逗号的唯一情况吗?如果是这样,请进行搜索/替换。但是,您在电子表格中显示的示例不显示逗号,您是如何将其正确输入电子表格的 - 手动输入?

标签: vba ms-access


【解决方案1】:

您的 CSV 文件中的字符串很可能使用引号进行了转义。如果您想使用自己的代码解析 CSV,那么您的代码需要能够忽略引号内出现的逗号。

一个快速的方法是使用 RegEx。您可以尝试以下方法:

Private Function changeDelimiter(line as String) as String

   Dim regEx As Object
   Set regEx = CreateObject("VBScript.regexp")
   regEx.IgnoreCase = True
   regEx.Global = True
   regex.Pattern = ",(?=([^" & Chr(34) & "]*" & Chr(34) & "[^" & Chr(34) & "]*" & Chr(34) & ")*(?![^" & Chr(34) & "]*" & Chr(34) & "))"

   changeDelimiter = regex.Replace(line, "#|#")

End Function

然后将代码中的 Split() 行更改如下:

SaleRowArray = Split(changeDelimiter(SaleRow), "#|#")

该函数将引号外的所有逗号替换为 #|#(我假设您的输入数据中不会出现此逗号)。然后,您将这些行拆分为 #|# 而不是逗号的数据字段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-25
    • 2018-11-26
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    • 2022-06-13
    相关资源
    最近更新 更多