Page 169 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 通常モードに戻る ┃ INDEX ┃ ≪前へ │ 次へ≫ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ▼テキストファイルにフィルターを掛ける 初心者M 02/10/6(日) 15:11 ┗Re:テキストファイルにフィルターを掛ける Hirofumi 02/10/6(日) 16:28 ─────────────────────────────────────── ■題名 : テキストファイルにフィルターを掛ける ■名前 : 初心者M ■日付 : 02/10/6(日) 15:11 -------------------------------------------------------------------------
こんにちは。 10万件以上あるテキストファイルから、必要なデータだけを取り出し、エクセルに読み込みたいのですが、ADOで接続し、フィルターを掛けたところ、 「0045」= 「45」 と照合しているようなのです。 ところが、テキストファイルでは 0045 なのですが、 読み込んでみると 45 となっているのです。 読み込む際に、フィールドのデータ型などを設定する必要があるのでしょうか? ' レコードセットをオープン Set rst = New ADODB.Recordset rst.Source = strDBName rst.ActiveConnection = cn rst.CursorType = adOpenStatic ’←この辺よく分からないので、本のまま。。 rst.Open Do While Not rst.EOF Debug.Print rst.Fields(0) ’← この地点で 0045 が 45 に。。。 Stop rst.MoveNext Loop テキストファイルの区切り記号は カンマと決まっているのですが、将来は項目が増加しそうなので 、どう扱えばいいのか困っています。 無条件でテキストファイルと同様に読み込む方法とか、フィールドのデータ型を調べる方法とか、 ヒントがあれば、教えてください。 宜しくお願いします。 |
>10万件以上あるテキストファイルから、必要なデータだけを取り出し、エクセルに読み込みたいのですが、ADOで接続し、フィルターを掛けたところ、 >「0045」= 「45」 と照合しているようなのです。 TextファイルにADOで接続し、Excelに抽出した事が無いので、 ゴミレスに成るかも知れませんが 余り複雑じゃない抽出ならVBAのOpenステートメントだけでも出来るのでは? 以下のコードはThisWorkbook.Pathにある "TestFile.csv"から 第1フィールドが「0045」、第2フィールドが「0046」の物を Excelのアクティブシートにに取り出す例です 標準モジュールに記入して下さい Public Sub CSVTextRead() Dim intCalc As Integer With Application '画面更新を停止 .ScreenUpdating = False '再計算の方法を保存 intCalc = .Calculation '再計算を手動へ .Calculation = xlCalculationManual End With CSVReadTextLine ThisWorkbook.Path & "\" & "TestFile.csv", "," With Application '再計算の仕方を元に戻す .Calculation = intCalc '再計算を実行 .Calculate '画面更新を再開 .ScreenUpdating = True End With End Sub Public Sub CSVReadTextLine(strFileName As String, _ Optional strDelimiter As String = ",") Dim i As Long Dim dfn As Integer Dim vntData As Variant Dim strLine As String Dim blnMultiLine As Boolean Dim strRec As String dfn = FreeFile Open strFileName For Input As dfn i = 1 Do Until EOF(dfn) Line Input #dfn, strLine strRec = strRec & strLine vntData = SplitLine(strRec, strDelimiter, , , blnMultiLine) If blnMultiLine Then strRec = strRec & vbLf Else 'もし第1フィールドが「0045」、 '第2フィールドが「0046」の物をExcelに取り出したいのなら If vntData(1, 1) = "0045" And vntData(1, 2) = "0046" Then Range(Cells(i, 1), _ Cells(i, UBound(vntData, 2))).Value = vntData i = i + 1 End If strRec = "" End If Loop Close #dfn End Sub Public Function SplitLine(ByVal strLine As String, _ Optional strDelimiter As String = ",", _ Optional strQuote As String = """", _ Optional strRet As String = vbCrLf, _ Optional blnMultiLine As Boolean = False) As Variant ' strLine :分割元と成る文字列 ' strDelimiter :区切り文字 ' SplitLine :戻り値、切り出された文字配列 Dim lngDPos As Long Dim vntData() As Variant Dim lngStart As Long Dim i As Long Dim strField As String Dim lngLength As Long i = 1 lngStart = 1 lngLength = Len(strLine) blnMultiLine = False Do ReDim Preserve vntData(1 To 1, 1 To i) If Mid(strLine, lngStart, 1) <> strQuote Then lngDPos = InStr(lngStart, strLine, _ strDelimiter, vbBinaryCompare) If lngDPos > 0 Then strField = Mid(strLine, lngStart, lngDPos - lngStart) lngStart = lngDPos + 1 Else strField = Mid(strLine, lngStart) lngStart = lngLength + 1 End If Else lngStart = lngStart + 1 Do lngDPos = InStr(lngStart, strLine, _ strQuote, vbBinaryCompare) If lngDPos > 0 Then strField = strField & Mid(strLine, lngStart, _ lngDPos - lngStart) lngStart = lngDPos + 1 Select Case Mid(strLine, lngStart, 1) Case "" Exit Do Case strDelimiter lngStart = lngStart + 1 Exit Do Case strQuote lngStart = lngStart + 1 strField = strField & strQuote End Select Else blnMultiLine = True strField = Mid(strLine, lngStart) & strRet lngStart = lngLength + 1 Exit Do End If Loop End If vntData(1, i) = strField strField = "" i = i + 1 Loop Until lngLength < lngStart SplitLine = vntData() End Function |