2016-11-10 2 views
0

У меня возникли проблемы.Выходной набор записей в VBA с использованием условия

У меня есть база данных csv с 25 миллионами строк с четырьмя столбцами: FIELD (от 1 до 5), DATEHOUR (в формате yyyyddmmhhmmssxxx, год, день, месяц, час, минута, секунда и милисекунды), BOUND (юг или север) и CATEGORY (от 1 до 10).

Я использую следующий код

Public Sub QueryTextFile() 
    Dim Recordset As ADODB.Recordset 
    Dim ConnectionString As String 
    ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ThisWorkbook.Path & ";" & _ 
     "Extended Properties=Text;" 

    Const SQL As String = "SELECT * FROM Dados.csv WHERE Categoria=3;" 

    Set Recordset = New ADODB.Recordset 
    Call Recordset.Open(SQL, ConnectionString, CursorTypeEnum.adOpenForwardOnly, LockTypeEnum.adLockReadOnly, CommandTypeEnum.adCmdText) 
    Call Sheet1.Range("A1").CopyFromRecordset(Recordset) 
    Recordset.Close 
    Set Recordset = Nothing 

End Sub 

проблемы в том, что я, например, хочу получить только регистры для ФЕВРАЛЯ (месяц 02) и FIELD 3. Как я могу это сделать?

Спасибо, ребята!

+0

'CopyFromRecordset' вернет только первые 65536 записей. 'ADODB.Recordset.GetRows' будет загружать полный набор записей в массив, который можно использовать для заполнения рабочего листа. Если вы можете предоставить ссылку для загрузки файла CSV, я помогу с кодом. –

ответ

0
SELECT * FROM Dados.csv 
WHERE 
Categoria = 3 AND 
FIELD = 3  AND 
DATEHOUR Like '######02*' 
0

С файлом такого размера, и если все, что вам нужно, это простая операция фильтра - вы можете просто прочесть его по строкам и сохранить соответствующие строки. Вот пример:

входного файла

FIELD,DATEHOUR,BOUND,CATEGORY 
1,20030609100744914,south,2 
2,19530310011542750,north,5 
5,19780506121938486,south,6 
3,19201602155516116,south,2 
3,19381909204504683,north,2 
4,19641002092156003,south,10 
1,19142109082009062,south,8 
5,19762306242234798,north,11 
2,19261008163849534,south,2 
1,19093003100715152,south,12 
1,19282102090128629,north,2 
5,19652606190400678,south,3 
3,19162302062356493,south,3 
5,20151605125616260,north,6 

и функции VBA:

Option Explicit 

Sub filterData() 

    Dim fileNum As Integer 
    Dim csvLine As String 

    Dim arrLine() As String  ' fields from the csv line, 0-based 
    Const FIELD = 0: Const DATEHOUR = 1: Const BOUND = 2: Const CATEGORY = 3 

    Dim arrResult() As String ' string array for filtered data 
    Dim idx As Long: idx = 1  ' current index in the array 
    ReDim arrResult(idx To 1000) ' initial size 

    ' read file line-by-line 
    fileNum = FreeFile() 
    Open ThisWorkbook.Path & Application.PathSeparator & "dataFile.csv" _ 
      For Input As #fileNum 

    While Not EOF(fileNum) 
     Line Input #fileNum, csvLine 
     ' 0-FIELD, 1-DATEHOUR, 2-BOUND, 3-CATEGORY 
     arrLine = Split(csvLine, ",") 

     ' check the condition for inclusion 
     If arrLine(FIELD) = "3" And Mid(arrLine(DATEHOUR), 7, 2) = "02" Then 
      If idx > UBound(arrResult) Then 
       ReDim Preserve arrResult(1 To UBound(arrResult) * 2) 
      End If 
      arrResult(idx) = csvLine 
      idx = idx + 1 
     End If 
    Wend 

    Close #fileNum 

    ' trim excess entries 
    ReDim Preserve arrResult(1 to idx - 1) 

    ' display results in the spreadsheet (only up to 1mm) 
    Worksheets("Sheet1").[a1].Resize(UBound(arrResult), 1) = Application.Transpose(arrResult) 

End Sub 

Вот результат, который вы получите в "Лист1":

enter image description here

PS: Или вы можете просто использовать UNIX grep ...

P.S.S .: Также обратите внимание, что если массив результатов будет больше, чем 1 мм записей, вы не сможете его отобразить в Excel. Код можно изменить, чтобы ограничить количество записей в массиве, отобразить только часть массива, отобразить его в нескольких столбцах или записать массив результатов в другой файл.

Смежные вопросы