从巨大的csv文件中提取字段并将其写入表,文本或csv文件

时间:2012-07-27 00:24:38

标签: vba ms-access csv vbscript

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

因为它无法在任何程序中打开(除了使用第三方程序将文件拆分成多个部分)我正试图提取一种方法来提取我需要的数据。我只需要大约10-15列。

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

任何人都可以帮忙吗?

谢谢

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

原始错误是“800a01f4变量未定义”,在网上建议取出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

2 个答案:

答案 0 :(得分: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以获取一系列建议。

答案 1 :(得分:0)

在VBE编辑器中

enter image description here

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

enter image description here

看起来您的代码不知道ADODB.COMMAND是什么,这应该解决这个问题。 我只知道我能够复制你的代码,并且能够在设置引用时成功完成它。 希望这有助于解释