Board logo

標題: 以ado方式,將csv檔放進陣列中出錯?(當中有英文字母) [打印本頁]

作者: joey0415    時間: 2013-10-7 13:19     標題: 以ado方式,將csv檔放進陣列中出錯?(當中有英文字母)

小弟的csv檔如下:
5        5922        11.85        0        2,000
7        5926        11.9        5,000        7,000
9        6162        11.8        1,000        0
11        616K        11.9        1,000        0
13        700I        11.75        2,000        0
15        700I        11.9        1,000        0

每列的第二個是英文與數字組成,其都是數字
如果以平常的方法放在sheet上,沒有問題
若將檔案放在陣列中,則第二個會出現空值,有時候也會顯示null
有什麼方法可以讓它,不會出現空值而且可以放進陣列中呢?

會想要用這個方法是想要加速處理數千張csv,如果放在表格上速度差上一段

我覺得關鍵在這句話:
strcon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strPath & ";Extended Properties=""text;HDR=no;IMEX=1;FMT=Delimited(,)"";"..

請幫忙

附上檔案

[attach]16262[/attach]

[attach]16261[/attach]
作者: joey0415    時間: 2013-10-7 17:58

http://club.excelhome.net/forum.php?mod=viewthread&tid=267031&pid=7230582&page=1&extra=#pid7230582
在網上找啊找,終於找到一個同樣問題的解答,按照最後的註冊表設置,問題總算是解決了。
網文如下:
連接字符串:
(1)ODBC:connstr="Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=d:\data\;Extensions=asc,csv,tab,txt;"
(2)OLEDB:connstr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\;Extended Properties=""text;HDR=Yes;FMT=Delimited"""
注意:
<1>路徑,即dbq或data source,只到目錄一級,不指定文件名(在sql語句中指定)
<2>HDR=YES,表示數據的第一行作為表的標題行,也就是列名,可以用這些列名來篩選數據

注意,連接串裡有IMEX=1,還不夠,還得修改註冊表,將ImportMixedTypes設置為Text才行。

Jet 和 ODBC 提供程序將返回佔多數的類型的數據,但對於佔少數的數據類型,則會返回 NULL(空)值

找了一天終於解決我的問題!謝謝excel home論壇
不過要修正一下

註冊表分32與64位元

附上我成功修改的畫面
[attach]16265[/attach]
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Text\Format
[attach]16264[/attach]

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Jet\4.0\Engines\Text
作者: c_c_lai    時間: 2013-10-7 18:57

回復 2# joey0415
提供你參考:
  1. Sub CSV_Import()
  2.     Dim ws As Worksheet, strFile As String

  3.     Sheets("檔案名稱").Select
  4.     Cells.Clear
  5.    
  6.     Set ws = ActiveSheet 'set to current worksheet name
  7.     '  strFile = Application.GetOpenFilename("Text Files (*.csv),*.csv", , "Please select text file...")
  8.     '  你也可以直接指定檔案名稱
  9.     strFile = ThisWorkbook.Path & "\9962.csv"

  10.     With ws.QueryTables.Add(Connection:="TEXT;" & strFile, Destination:=ws.Range("A1"))
  11.          .TextFileParseType = xlDelimited
  12.          .TextFileCommaDelimiter = True
  13.          .Refresh
  14.     End With
  15. End Sub
複製代碼

作者: c_c_lai    時間: 2013-10-7 19:37

回復 1# joey0415
  1. Sub CSV_Import()
  2.     Dim ws As Worksheet, strFile As String, i As Long
  3.     Dim arr
  4.    
  5.     Sheets("檔案名稱").Select
  6.     Cells.Clear
  7.    
  8.     Set ws = ActiveSheet 'set to current worksheet name
  9.     '  strFile = Application.GetOpenFilename("Text Files (*.csv),*.csv", , "Please select text file...")
  10.     '  你也可以直接指定檔案名稱
  11.     strFile = ThisWorkbook.Path & "\9962.csv"

  12.     With ws.QueryTables.Add(Connection:="TEXT;" & strFile, Destination:=ws.Range("A1"))
  13.          .TextFileParseType = xlDelimited
  14.          .TextFileCommaDelimiter = True
  15.          .Refresh
  16.     End With
  17.    
  18.     arr = Range("A1:E" & Range("A" & Rows.Count).End(xlUp).Row)
  19.     For i = LBound(arr, 2) To UBound(arr, 1)
  20.         Debug.Print arr(i, 1) & ","; arr(i, 2) & ", " & arr(i, 3) & ", " & arr(i, 4) & ", " & arr(i, 5) & ";"
  21.     Next i
  22. End Sub
複製代碼

作者: joey0415    時間: 2013-10-7 19:45

本帖最後由 joey0415 於 2013-10-7 19:47 編輯

回復 3# c_c_lai

我自己試的結果是,querytable後它後放在cells上,一格一個放好

之前我也是這樣做,沒有文字問題,沒有null問題

我的想法是,如果可以打開csv檔,並且直接放在陣列中會比較快

因為前面兩個方法,最後都要放進資料庫中

可能還有其它好方法,不過目前我只會這兩招

如果有更好的方法請提供一下…

=========================
以QT方法後從CELLS放進資料庫
以ADO後放進陣列後,再轉進資料庫

前者:1500個CSV  花費1800~2000秒
後者:1500個CSV  花費1000~1100秒

如果有高手請多關照…
謝謝
作者: joey0415    時間: 2013-10-7 21:16

剛剛又試了三次,第二種方法平均只要600多秒!超快!




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)