У меня есть 3 CSV-файла, расположенные в разных сетевых папках. В сетевых папках / подпапках могут быть пробелы. Я хочу объединить эти 3 файла CSV, чтобы создать один набор записей ADO, содержащий необходимые столбцы.
Test1.csv (я исключил ненужные столбцы из всех файлов CSV)
T1Id | Gpos | lbl
-----------------------
1001 | 0 | Innovate
1002 | 1 | Buys
1003 | 2 | Sales
1004 | 3 | Forecasts
1005 | 4 | Usage
1006 | 5 | Forum
Test2.csv: (я исключил ненужные столбцы из всех CSV-файлов)
T2Id | T1Id | Apos | tval
-----------------------------------
382 | 1001 | 1 | my life my rules.
203 | 1001 | 2 | earth wind rain and fire.
658 | 1002 | 1 | wealth power blood desire.
200 | 1003 | 1 | one good to live for.
301 | 1003 | 2 | before we die.
439 | 1004 | 1 | one taste to glory
795 | 1004 | 2 | one mouthful of sky.
494 | 1004 | 3 | some other text.
Test3.csv: (я исключил ненужные столбцы из всех CSV-файлов)
(blank) Aggregate (blank) Aggregate 149_SG_Bryl_Cream 891_SG_Myo__Sky_Blue_Dress
------------------------------------------------------------------------------
X0.1 0.422300 0.424658 0.458014 0.434639
X0.2 0.318628 0.345475 0.334548 0.333675
X0.3 0.274694 0.274643 0.243424 0.286865
X0.4 0.294568 0.346758 0.276552 0.366648
X1.1 0.565734 0.293436 0.283564 0.235366
X1.2 0.286657 0.755456 0.283233 0.310544
X2.1 0.234643 0.245459 0.245434 0.343423
X2.2 0.343645 0.455659 0.343282 0.334343
X2.3 0.234643 0.245459 0.245434 0.343423
Как видите, у Test3.csv есть 4 проблемы:
- В нем есть столбцы с пустыми заголовками, но с данными, например,
X0.1
. - У него есть столбцы с пустыми заголовками, но с
no data
. - У него есть 2
Aggregate
столбцов с одинаковыми именами. - У него есть
SG
столбцов (много), которые мне нужныдля извлечения only the part starting from 'SG'.
Требования
Test1
& Test2
CSV должны быть объединены в T1Id
. - Не нужно сохранять только столбцы
lbl
и tval
из этого файла. Apos
и Gpos
будут использоваться для объединения 2 столбцов, созданных из 1-го пустого столбца заголовкаmn (содержит значения, такие как X0.1
) в файле Test3.csv
.
Код:
Sub Doit(cFiles As Collection)
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Dim strSQL1$, TempSG$,sFullDirectory$
sFullDirectory = `\\xxx.xxx.xxx\client name`\
strFF1 = "Test1.csv"
strFF2 = "Test2.csv"
strFF3 = "Test3.csv"
' Test1.csv Path: `\\xxx.xxx.xxx\client name\XYZ\sub-folder1 name`\
strF1 = cFiles(strFF1)
' Test1.csv Path: `\\xxx.xxx.xxx\client name\ABC\sub-folder2 name`\
strF2 = cFiles(strFF2)
' Test1.csv Path: `\\xxx.xxx.xxx\client name\DEF\GHI\sub-folder1 name`\
strF3 = cFiles(strFF3)
Set oCon = CreateObject("ADODB.Connection")
Set oRs = CreateObject("ADODB.Recordset")
strCon = "Driver=Microsoft Access Text Driver (*.txt, *.csv);Dbq=" & sFullDirectory & ";Extensions=asc,csv,tab,txt;HDR=Yes;"
' Select TOP 1 row with headers from `Test3.csv`
strSQL = "SELECT TOP 1 * FROM " & strF3 & strFF3
oCon.Open strCon
Set oRs = oCon.Execute(strSQL)
i = 1
strSQL = "SELECT "
For Each Fld In oRs.Fields
Select Case True
Case Is = Fld.Name = "NoName" 'Blank header columns
If Fld.Value <> vbNullString Then
strSQL = strSQL & " CLng(Replace(Left(" & Fld.Name & ", InStr(" & Fld.Name & ", '.') - 1), 'X', ''))" & " AS [gval],"
strSQL = strSQL & " CLng(Right(" & Fld.Name & ", Len(" & Fld.Name & ") - InStr(" & Fld.Name & ", '.')))" & " AS [pos],"
Else
' Do nothing here
End If
Case Is = Fld.Name = "Aggregate"
strSQL = strSQL & " CDbl([" & Fld.Name & "]) AS [Aggregate " & i & "],"
i = i + 1
Case Is = InStr(1, Fld.Name, "SG") > 0
TempSG = Trim(Mid(Fld.Name, InStr(1, Fld.Name, "SG"), Len(Fld.Name)))
strSQL = strSQL & " CDbl([" & Fld.Name & "]) AS [" & TempSG & "], "
End Select
Next Fld
If Right(Trim(strSQL), 1) = "," Then strSQL = Left(Trim(strSQL), Len(Trim(strSQL)) - 1)
strSQL = strSQL & " FROM " & strF3 & strFF3
strSQL = strSQL & " WHERE ((NoName) <> 'Base Sizes')"
oRs.Close
' This `strSQL1` will be used to join `strSQL`.
strSQL1 = "SELECT G.[lbl], A.[tval], Q.*"
strSQL1 = strSQL1 & " FROM "
strSQL1 = strSQL1 & " (SELECT G.[Gpos], A.[Apos], G.[lbl], A.[tval] FROM " & strF1 & strFF1 & " G," & strF2 & strFF2 & " A WHERE G.[T1Id] = A.[T1Id]) T, (" & strSQL & ") Q "
strSQL1 = strSQL1 & " WHERE (CLng(T.[G].[Gpos]) = CLng(Q.[gval])) AND (CLng(T.[A].[Apos]) = CLng(Q.[pos]))"
strSQL1 = strSQL1 & " ORDER BY CLng(Q.[gval]), CDbl(Q.[Aggregate 1]) DESC, G.[lbl];"
'CREATE RECORDSET FROM SQL STRING
Set oRs = oCon.Execute(strSQL1)
ExitSub:
oRs.Close
oCon.Close
Set oRs = Nothing
Set oCon = Nothing
Application.ScreenUpdating = True
Application.DisplayAlerts = True
Exit Sub
ErrorHandler:
MsgBox "Error No: " & Err.Number & vbCrLf & "Description: " & Err.Description, vbCritical + vbOKOnly, "An Error occurred!"
Err.Clear
On Error GoTo 0
Resume ExitSub
End Sub
После разбиения таблицы Test3.csvэто:
gval pos (blank) Aggregate (blank) Aggregate 149_SG_Bryl_Cream 891_SG_Myo__Sky_Blue_Dress
------------------------------------------------------------------------------
0 1 0.422300 0.424658 0.458014 0.434639
0 2 0.318628 0.345475 0.334548 0.333675
0 3 0.274694 0.274643 0.243424 0.286865
0 4 0.294568 0.346758 0.276552 0.366648
1 1 0.565734 0.293436 0.283564 0.235366
1 2 0.286657 0.755456 0.283233 0.310544
2 1 0.234643 0.245459 0.245434 0.343423
2 2 0.343645 0.455659 0.343282 0.334343
2 3 0.234643 0.245459 0.245434 0.343423
Финальный стол: (краткий пример)
lbl txval gval pos Aggregate 1 Aggregate 2 SG_Bryl_Cream SG_Myo__Sky_Blue_Dress
-------------------------------------------------------------------------------------------------------------------
Innovate My life my rules. 0 1 0.422300 0.424658 0.458014 0.434639
Innovate earth wind rain and fire. 0 2 0.318628 0.345475 0.334548 0.333675
Buys my life my rules. 1 1 0.565734 0.293436 0.283564 0.235366
Buys earth wind rain and fire. 1 2 0.286657 0.755456 0.283233 0.310544
Sales my life my rules. 2 1 0.234643 0.245459 0.245434 0.343423
Sales earth wind rain and fire. 2 2 0.343645 0.455659 0.343282 0.334343
Sales Some other text. 2 3 0.234643 0.245459 0.245434 0.343423
...
Вопросы
- ЕстьЕсть ли способ выбрать оба дубликата
Aggregate
столбцов с помощью SQL? - Есть ли способ выбрать только
SG
столбцов из Q
, т.е. Test3.csv
через SQL?
например,
strSQL1 = "SELECT G.[lbl], A.[tval], Q.* "
вместо:
strSQL1 = "SELECT G.[lbl], A.[tval], Q.* LIKE 'SG' "