2012-07-27 113 views
1

我有這個巨大的csv文件,它是4GB,不知道有多少行,但有320列。從一個巨大的csv文件中提取字段,並將它們寫入表,文本或csv文件

因爲它不能在任何程序中打開(除了使用第三方程序將文件拆分成多個部分)我試圖找到一種方法來提取我需要的數據。我只需要大約10-15列。

我在網上看到了很多解決方案(大部分是在vbs中),但是我無法獲得任何解決方案。我會得到錯誤,我不知道vbs能夠排除故障。

誰能幫助嗎?

謝謝

PS這裏的VBS代碼,我發現和使用,我不得不沒有運氣嘗試過的一個例子。

原來的錯誤是「800a01f4變量未定義」,在網絡上建議取出OPTION EXPLICIT。一旦我這樣做,下一個錯誤是「800a01fa類未定義」。

在這兩種情況下給出錯誤的行是「設置adoJetCommand =新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 
+0

我想補充一點,我看到這篇文章http://stackoverflow.com/questions/427488/want-vba-in-excel-to-read-very-large-csv-and-create -output-file-of-a-small-subse?rq = 1並嘗試了vbs選項(錯誤「沒有爲給出的參數給出一個值」,我不明白vba解決方案。我不只是發佈沒有先花費幾個小時搜索,並嘗試一切我可以。謝謝你! – lalachka 2012-07-27 00:37:49

+0

謝謝你,我會解決,但我怕我的錯誤拋出之前,我甚至到了這一點 – lalachka 2012-07-27 01:25:47

+0

我剛剛檢查並且我看不到字段不匹配 – lalachka 2012-07-27 01:29:40

回答

1

如果您的CSV文件很簡單,沒有在意想不到的地方換行或逗號,那麼標準的* nix工具awk將是有用的。它可以讓你輕鬆地提取你正在尋找的15個列到一個新的CSV文件。 This blog post給出了一個解釋如何在CSV文件中使用它。

假設你想從file.csv提取,3列1和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了一堆建議。

+0

非常感謝你!但出於教育目的,這是怎麼做的VBA或VBS? (如果你知道)))) – lalachka 2012-07-27 01:29:06

+0

對不起,沒有經驗。 [此帖](http://stackoverflow.com/q/736629/1380680)有幫助嗎?這是關於VB.net,雖然... – 2012-07-27 02:57:58

+0

@lalachka爲什麼你接受這個答案,如果你想'vba'或'vbs'? FWIW我喜歡這個方法,我把'awk'加到了待辦事項列表 – brettdj 2012-07-27 03:52:30

0

在VBE編輯

enter image description here

然後找到在Microsoft ActiveX數據對象庫列表。 不知道哪個版本可能是適當的,但大概6

enter image description here

好像你的代碼不知道什麼ADODB.COMMAND是,這應該解決這個問題。 我只知道我能夠複製您的代碼,並且能夠成功地完成參考設置。 希望這有助於解釋

+0

ohh,我在vbs中運行這個。讓我試試vba。謝謝。這就是爲什麼我很迷茫,我不明白你如何設置引用vbs。 – lalachka 2012-07-27 20:01:18

+0

我得到了那個庫,在vba中,代碼經過了那個點,並給出了一個錯誤「item無法在與請求的名字或序號對應的集合中找到」。在調試器中,以「adoJetCommand.CommandText =」INSERT INTO NPIs「開頭的塊突出顯示爲 – lalachka 2012-07-27 21:03:01

+0

似乎csv文件未被正確讀取。我已經得到了我昨晚需要通過分割csv文件完成的工作,所以這是嚴格的對於教育,但我仍然很想知道問題是什麼,謝謝你的時間。 – lalachka 2012-07-27 21:14:45

相關問題