【问题标题】:extract fields from a huge csv file and write them to a table, text or csv file从巨大的 csv 文件中提取字段并将它们写入表格、文本或 csv 文件
【发布时间】:2026-01-10 16:40:01
【问题描述】:

我有一个巨大的 csv 文件,它有 4GB,不知道有多少行,但有 320 列。

因为它不能在任何程序中打开(除了使用 3rd 方程序将文件拆分为多个部分),我正在尝试寻找一种方法来提取我需要的数据。我只需要大约 10-15 列。

我在网上看到了许多解决方案(大多数在 vbs 中),但我无法让它们中的任何一个工作。我会得到错误,我不知道 vbs 能够解决它们。

有人可以帮忙吗?

谢谢

PS 这是我发现并尝试使用的 vbs 代码的一个示例,但我没有运气。

原来的错误是“800a01f4 variable is undefined”,网上有人建议去掉OPTION EXPLICIT。一旦我这样做了,下一个错误就是“800a01fa class not defined”。

在这两种情况下,给出错误的行都是“Set adoJetCommand = New ADODB.Command”

Option Explicit



Dim adoCSVConnection, adoCSVRecordSet, strPathToTextfile
Dim strCSVFile, adoJetConnection,adoJetCommand, strDBPath


Const adCmdText = &H0001

' Specify path to CSV file.
strPathToTextFile = "C:\Users\natalie.rynda\Documents\Temp\RemailMatch\"

' Specify CSV file name.
strCSVFile = "NPIOld.csv"

' Specify Access database file.
strDBPath = "C:\Users\natalie.rynda\Documents\Temp\RemailMatch\NPIs.mdb"

' Open connection to the CSV file.
Set adoCSVConnection = CreateObject("ADODB.Connection")
Set adoCSVRecordSet = CreateObject("ADODB.Recordset")

' Open CSV file with header line.
adoCSVConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
    "Data Source=" & strPathtoTextFile & ";" & _
    "Extended Properties=""text;HDR=YES;FMT=Delimited"""

adoCSVRecordset.Open "SELECT * FROM " & strCSVFile, adoCSVConnection

' Open connection to MS Access database.
Set adoJetConnection = CreateObject("ADODB.Connection")
adoJetConnection.ConnectionString = "DRIVER=Microsoft Access Driver (*.mdb);" _
    & "FIL=MS Access;DriverId=25;DBQ=" & strDBPath & ";"
adoJetConnection.Open

' ADO command object to insert rows into Access database.
Set adoJetCommand = New ADODB.Command


Set adoJetCommand.ActiveConnection = adoJetConnection
adoJetCommand.CommandType = adCmdText

' Read the CSV file.
Do Until adoCSVRecordset.EOF
    ' Insert a row into the Access database.
    adoJetCommand.CommandText = "INSERT INTO NPIs " _
        & "(NPI, EntityTypeCode, ReplacementNPI, EIN, MAddress1, MAddress2, MCity, MState, MZIP, SAddress1, SAddress2, SCity, SState, SZIP, ProviderEnumerationDate, LastUpdateDate, NPIDeactivationReasonCode, NPIDeactivationDate, NPIReactivationDate) " _
        & "VALUES (" _
            & "'" & adoCSVRecordset.Fields("NPI").Value & "', " _
            & "'" & adoCSVRecordset.Fields("Entity Type Code").Value & "', " _
            & "'" & adoCSVRecordset.Fields("Replacement NPI").Value & "', " _
            & "'" & adoCSVRecordset.Fields("Employer Identification Number (EIN)").Value & "', " _
            & "'" & adoCSVRecordset.Fields("Provider First Line Business Mailing Address").Value & "', " _
            & "'" & adoCSVRecordset.Fields("Provider Second Line Business Mailing Address").Value & "', " _
            & "'" & adoCSVRecordset.Fields("Provider Business Mailing Address City Name").Value & "', " _
            & "'" & adoCSVRecordset.Fields("Provider Business Mailing Address State Name").Value & "', " _
            & "'" & adoCSVRecordset.Fields("Provider Business Mailing Address Postal Code").Value & "', " _
            & "'" & adoCSVRecordset.Fields("Provider First Line Business Practice Location Address").Value & "', " _
            & "'" & adoCSVRecordset.Fields("Provider Second Line Business Practice Location Address").Value & "', " _
            & "'" & adoCSVRecordset.Fields("Provider Business Practice Location Address City Name").Value & "', " _
            & "'" & adoCSVRecordset.Fields("Provider Business Practice Location Address State Name").Value & "', " _
            & "'" & adoCSVRecordset.Fields("Provider Business Practice Location Address Postal Code").Value & "', " _
            & "'" & adoCSVRecordset.Fields("Provider Enumeration Date").Value & "', " _
            & "'" & adoCSVRecordset.Fields("Last Update Date").Value & "', " _
            & "'" & adoCSVRecordset.Fields("NPI Deactivation Reason Code").Value & "', " _
            & "'" & adoCSVRecordset.Fields("NPI Deactivation Date").Value & "', " _
            & "'" & adoCSVRecordset.Fields("NPI Reactivation Date").Value & "')"
    adoJetCommand.Execute
    adoCSVRecordset.MoveNext
Loop



' Clean up.
adoCSVRecordset.Close
adoCSVConnection.Close
adoJetConnection.Close

【问题讨论】:

  • 我想补充一点,我看到了这个帖子*.com/questions/427488/… 并尝试了 vbs 选项(错误“没有为所需参数之一提供值”,我不明白 vba 解决方案。这个就是说我不是在没有先花几个小时搜索和尝试一切的情况下才发布的。谢谢!!
  • 谢谢,我会改正的,但恐怕我的错误还没到那一步就被抛出
  • 我刚刚检查过,但没有看到字段不匹配的地方。
  • 在您的 DIM 语句中尝试将 Dim adoJetCommand 作为新的 ADODB.Command,看看它是否能让您在代码的逐步执行中走得更远。还要检查您是否参考了 Microsoft Activex 数据对象库

标签: vba ms-access csv vbscript


【解决方案1】:

如果您的 CSV 文件简单明了,在意想不到的地方没有换行符或逗号,那么标准的 *nix 工具 awk 会很有用。它可以让您轻松地将您正在寻找的 15 列提取到一个新的 CSV 文件中。 This blog post 解释了如何在 CSV 文件上使用它。

假设您想从file.csv 中提取第 1、3 和 7 列,那么您可以使用命令来完成此操作

awk -F, '{print $1","$3","$7;}' file.csv

您的 Windows 机器可能没有安装 awk。有几个选项:

  • 您可以在 MSYS,基本上就是 在 Windows 中为您提供类 Unix 的 shell 环境。对我来说,这似乎是最简单的方法。

  • 另一个选项似乎是Gawk for Windows,但我 没有这方面的经验,所以不能保证。

  • 您可以尝试使用 Windows 获得相同的结果 PowerShell,如this blog post 中所述 - 如果你有可用的。同样,我没有尝试过的经验。

  • 最后但同样重要的是,您可以切换到 Linux,例如在 虚拟机。 awk 通常在 *nix 环境中可用。

如果您要解析更难处理的 CSV 文件,请查看 parse csv file using gawk 以获取大量建议。

【讨论】:

  • 非常感谢!!但出于教育目的,如何使用 vba 或 vbs 完成此操作? (如果你知道))))
  • 抱歉,没有这方面的经验。 this post 有帮助吗?虽然它是关于 VB.net...
  • @lalachka 如果您想要vbavbs,为什么要接受这个答案? FWIW 我喜欢这种方法,我已将 awk 添加到待办事项列表中
  • 因为我是新来的,100% 不懂规则。我想如果答案是正确的 - 那么它就是一个答案。但这是真的,我想要 vba 或 vbs。我只是不想对 Reinier 无礼))))
  • @lalachka 我不会认为这是粗鲁的,因为你解释了你的动机。我当然不能为其他人说话。但是,在这种情况下,提出一个新问题对我来说听起来更合适。您正在从“如何处理大型 CSV 文件”转向“我的代码出了什么问题”。您可以剪下“谢谢”下方的部分并将其用作新问题。这真的取决于你最终想要做什么。本网站的用户共同构成了不成文的行为规则,而您就是其中之一。
【解决方案2】:

在 VBE 编辑器中

然后在列表中找到 Microsoft Activex 数据对象库。 不确定哪个版本可能合适,但可能是 6

您的代码似乎不知道 ADODB.COMMAND 是什么,这应该可以解决这个问题。 我只知道在设置引用时我能够复制您的代码,并且能够成功地单步执行它。 希望这有助于解释

【讨论】:

  • 哦,我在 vbs 中运行这个。让我试试vba。谢谢。这就是为什么我很迷茫,我不明白如何在 vbs 中设置引用。
  • 我得到了那个库,在 vba 中,代码超过了那个点并给出了错误“在与请求的名称或序号相对应的集合中找不到项目”。在调试器中,以“adoJetCommand.CommandText = “INSERT INTO NPIs”开头的块被突出显示
  • 似乎未正确读取 csv 文件。我昨晚已经通过拆分 csv 文件完成了我需要做的事情,所以这完全是为了教育,但我仍然很想找出问题所在。谢谢你的时间。
  • 那么这是否让您前进了一步?还是您之前在同一点遇到错误?
  • 是的)))我通过了原始错误并卡在“adoJetCommand.CommandText =”INSERT INTO NPIs“行。我的猜测是csv文件没有被读取。我试着把“ MsgBox adoCSVRecordSet.Fields("Provider Enumeration Date").Value" 在该行之前(只是看看它是否会向我显示值)并得到相同的错误。所以它似乎没有读取文件