Diskuze: hromadný import csv souborů
V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.


Dobry
napadá mne takový skript
CREATE TYPE typeCsv AS TABLE
(
id int identity,
a int,
)
GO
declare @csv1 typeCsv
declare @csv2 typeCsv
declare @csv3 typeCsv
...
BULK INSERT @csv1 FROM 'PathToCSVFile1' WITH (ROWTERMINATOR = '\n')
BULK INSERT @csv2 FROM 'PathToCSVFile2' WITH (ROWTERMINATOR = '\n')
BULK INSERT @csv3 FROM 'PathToCSVFile3' WITH (ROWTERMINATOR = '\n')
...
SELECT
A1.a AS A1,
A2.a AS A2,
A3.a AS A3
...
INTO tab1
FROM @csv1 A1
INNER JOIN @csv2 A2 ON A1.id = A2.id
INNER JOIN @csv3 A3 ON A1.id = A3.id
....
ORDER BY A1.id
GO
DROP TYPE typeCsv
GO
ale bude to dost psani .. vygenerovat to dalsim skriptem
A soubor 1,2,3 jsou fyzicke soubory na disku nebo tak nazyvas soubor dat,
jako skupinu dat, jak se pouziva v chytrych knizkach?
A jake parametry ten csv soubor ma?
A jak v nem zjistujes pocet sloupcu?
Vlastnosti csv (excel):
- oddelovac radku \n
- oddelovac sloupcu ;
- escapovani stringu, pokud se nejaky znak escapuje nebo je to string a ne cislo "text"
- escapovani znaku, pokud je v textu jeden ze znaku odelovace nebo escapovani "
Cili, ten text muze vypadat i takto:
a;b;"c";"""\n"
a a b escapovane byt muzou, ale nemusi
c je text: c;"\n (po zruseni csv escapovani)
Ja jen, je dobre si uvedomit, jaka jsou pravidla. Z tveho zadani neni uplne
jasne, jaky je pocet radku nebo sloupcu. A jestli to chces resit sql prikazy
nebo jak? Do jakych tabulek (struktura pres create table...). Zkratka se mi to
nezda dost jasne.
Asi by bylo lepsi to resit pres sql procedury nebo v php, treba
Michal Kotalik:26.8.2021 12:39
Jsou to fyzické csv souboury na disku. Je to výstup z jiného specializovaného programu, který umí bohužel output jen 63 sloupců.
Je to vlastně tabulka csv, kde první řádek jsou názvy sloupců(celkem
8190 sloupců), první sloupec je unikátní čas pro každý řádek(celkem cca
500 000 řádků) a zbytek jsou pouze číselné hodnoty(na 8 desetinných
míst), vše odděleno ";".
A tato tabulka je rozdělena po 63 sloupcích na 130 samostatných csv
souborů.
A do MS SQL Server bych je potřeboval do jedné tabulky.
Michal Kotalik:27.8.2021 18:19
Upřímě řečeno, nevím zda je to nezbytně nutné, mít to v jedné tabulce. Jde o to, že tato data mají být použita jako základ pro další výpočty( pouze porvnávání >,<,=, a četnosti) a bylo mi řečeno, že na takový objem údajů ( pouze řádky budou přibývat) je nejlepší SQL Server. A jelikož jsem s ním nikdy před tím nepracoval, tak jsem myslel, že by to bylo nejlepší. Jde zkrátka o to, aby se těch 130 souborů nemuselo zadávat jeden po druhém. Ale šlo to udělat naráz.
Nebyl by nejaky priklad? Se mi zda, ze 8000 sloupcu je nejaka hloupost. Co to jsou za data? Odkud? Treba jako excel taky bude mit s 8000 sloupci problem. Radku muzes mit kolik chces, ale limit sloupcu byva omezen. A tez by bylo dobre mit nejaky id sloupec.
Treba jako by se to dalo nahrat do pameti a udelat si program, ktery v tom
vyhledava. Neresit to pres sql. Ale, sql by melo byt rychlejsi Neco jako lite-sql, ktere pracuje
se soubory. Nebo na ssd se to da nacpat, ale rikas, ze bude radku pribyvat, tak
to neni ono.
Nebyla by treba ukazka, 3 radky, ktere maji tech 8000 sloupcu?
Totiz, jako, kdyz clovek vytvari tabulky do sql, tak vetsinou treba 30 tabulek a
propojuje se to pres JOIN a idecka, pomocne tabulky. Treba mas ciselnik mest a
obci, psc, adres, ... U nas mame tabulku osoby. Dalsi tabulku pracovni vysledky
a obe jsou propojene treti tabulkou se sloupci id_osoba, id_vysledky. Timpadem
fura textu, ktery by byl duplicitne, je nahrazeno cislem id. A kdyz ty data
potrebuji, tak je pomoci sql prikazu propojim. A kdyz ne, tak mne ty ostatni
tabulky nezajimaji. A tez muzes udelat klice/indexy nad sloupci a sql si udela
vlastni pomocne tabulky, ktere budou rychleji vyhledavat konkretni cisla radku
pro dane sloupce.
Teda, jako, vypada to, e o chovani a funkci sql moc nevis a ze se tam pokousis
natlacit jakasi surova data, nejakou tabulku z excelu. Ale, jak rikam, 8000
sloupcu by se excelu tez nemuzelo libit
Vis, jako, jestli by neslo dat tu tabulku, jestli to mas csv, do pameti. A cisla radku a sloupce, ktere budes pouzivat pro vyhledavani, nasoukat do sql. Tak se ti to smrskne treba na 10 sloupcu. A data si pak vycucas z toho souboru podle cisla radku. Tuim, ze prave to lite-sql umi pracovat primo s csv.
Petan:9.9.2021 11:33
BULK INSERT je reseni ale otazka je co udelat z 8000 sloupci ?
tak nějak matně si pamatuju, že max. počet sloupců v MS Excel je 16K
https://answers.microsoft.com/…68b599b31bf5
ale klidně SQL mužeš v MS Excelu použít už hotové SQL Querry neboli "QueryTables.Add" příkaz, který se právě ideálně hodí na takovéto "hovadiny":
Sub ImportDataFile(ByVal FileName As String, ByVal SheetName As String, ByVal Sep As Long)
Dim l_FileName As String
Dim l_Sep As String
Sheets(SheetName).Select
Sheets(SheetName).Activate
Sheets(SheetName).Cells.Select
Sheets(SheetName).Cells.Clear
Range("A1").Select
l_FileName = FileName
l_Sep = Chr(Sep)
' CREATE SQL QUERRY and load data from file to worksheet
With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;" & l_FileName, Destination:=Range("A1"))
.Name = "l_FileName" '& ActiveSheet.QueryTables.Count + 1
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = xlMSDOS '437
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierNone
.TextFileConsecutiveDelimiter = True
.TextFileTabDelimiter = False
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = False
.TextFileSpaceDelimiter = False
.TextFileDecimalSeparator = "."
.TextFileOtherDelimiter = l_Sep
.TextFileColumnDataTypes = Array(xlGeneralFormat)
.Refresh BackgroundQuery:=True
End With
Sheets(SheetName).QueryTables(1).Delete
Worksheets(SheetName).Cells.Select
End Sub
'Public Sub ClearClipboard() 'for fast computers with Win 7
'
'Dim Ret
'
'Ret = OpenClipboard(0&)
'If Ret <> 0 Then Ret = EmptyClipboard
'CloseClipboard
'
'End Sub
'Declare Function OpenClipboard _
' Lib "User32.dll" _
'(ByVal hWndNewOwner As Long) As Long
'
'Declare Function EmptyClipboard _
' Lib "User32.dll" () As Long
'
'Declare Function CloseClipboard _
' Lib "User32.dll" () As Long
Sub AddNew()
Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = Sheets("MAIN").Range("D7").Value
End Sub
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' ImportTextFile
' This imports a text file into Excel.
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub Import()
' if you need to create list of worksheets uncheck these lines - only one time no more !!!
'Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = Sheets("MAIN").Range("D7").Value
'Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = Sheets("MAIN").Range("D8").Value
'Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = Sheets("MAIN").Range("D9").Value
'Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = Sheets("MAIN").Range("D10").Value
'Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = Sheets("MAIN").Range("D11").Value
'Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = Sheets("MAIN").Range("D12").Value
'Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = Sheets("MAIN").Range("D13").Value
'Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = Sheets("MAIN").Range("D14").Value
'Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = Sheets("MAIN").Range("D15").Value
'Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = Sheets("MAIN").Range("D16").Value
'Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = Sheets("MAIN").Range("D17").Value
'Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = Sheets("MAIN").Range("D18").Value
'Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = Sheets("MAIN").Range("D19").Value
'Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = Sheets("MAIN").Range("D20").Value
'Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = Sheets("MAIN").Range("D21").Value
'Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = Sheets("MAIN").Range("D22").Value
'Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = Sheets("MAIN").Range("D23").Value
'Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = Sheets("MAIN").Range("D24").Value
'Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = Sheets("MAIN").Range("D25").Value
'Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = Sheets("MAIN").Range("D26").Value
ImportDataFile FileName:=Sheets("MAIN").Range("B3").Value + "\" + Sheets("MAIN").Range("B7").Value + "\" + Sheets("MAIN").Range("C7").Value, SheetName:=Sheets("MAIN").Range("D7").Value, Sep:=Sheets("MAIN").Range("B30").Value
ImportDataFile FileName:=Sheets("MAIN").Range("B3").Value + "\" + Sheets("MAIN").Range("B8").Value + "\" + Sheets("MAIN").Range("C8").Value, SheetName:=Sheets("MAIN").Range("D8").Value, Sep:=Sheets("MAIN").Range("B30").Value
ImportDataFile FileName:=Sheets("MAIN").Range("B3").Value + "\" + Sheets("MAIN").Range("B9").Value + "\" + Sheets("MAIN").Range("C9").Value, SheetName:=Sheets("MAIN").Range("D9").Value, Sep:=Sheets("MAIN").Range("B30").Value
ImportDataFile FileName:=Sheets("MAIN").Range("B3").Value + "\" + Sheets("MAIN").Range("B10").Value + "\" + Sheets("MAIN").Range("C10").Value, SheetName:=Sheets("MAIN").Range("D10").Value, Sep:=Sheets("MAIN").Range("B30").Value
ImportDataFile FileName:=Sheets("MAIN").Range("B3").Value + "\" + Sheets("MAIN").Range("B11").Value + "\" + Sheets("MAIN").Range("C11").Value, SheetName:=Sheets("MAIN").Range("D11").Value, Sep:=Sheets("MAIN").Range("B30").Value
ImportDataFile FileName:=Sheets("MAIN").Range("B3").Value + "\" + Sheets("MAIN").Range("B12").Value + "\" + Sheets("MAIN").Range("C12").Value, SheetName:=Sheets("MAIN").Range("D12").Value, Sep:=Sheets("MAIN").Range("B30").Value
ImportDataFile FileName:=Sheets("MAIN").Range("B3").Value + "\" + Sheets("MAIN").Range("B13").Value + "\" + Sheets("MAIN").Range("C13").Value, SheetName:=Sheets("MAIN").Range("D13").Value, Sep:=Sheets("MAIN").Range("B30").Value
ImportDataFile FileName:=Sheets("MAIN").Range("B3").Value + "\" + Sheets("MAIN").Range("B14").Value + "\" + Sheets("MAIN").Range("C14").Value, SheetName:=Sheets("MAIN").Range("D14").Value, Sep:=Sheets("MAIN").Range("B30").Value
ImportDataFile FileName:=Sheets("MAIN").Range("B3").Value + "\" + Sheets("MAIN").Range("B15").Value + "\" + Sheets("MAIN").Range("C15").Value, SheetName:=Sheets("MAIN").Range("D15").Value, Sep:=Sheets("MAIN").Range("B30").Value
ImportDataFile FileName:=Sheets("MAIN").Range("B3").Value + "\" + Sheets("MAIN").Range("B16").Value + "\" + Sheets("MAIN").Range("C16").Value, SheetName:=Sheets("MAIN").Range("D16").Value, Sep:=Sheets("MAIN").Range("B30").Value
ImportDataFile FileName:=Sheets("MAIN").Range("B3").Value + "\" + Sheets("MAIN").Range("B17").Value + "\" + Sheets("MAIN").Range("C17").Value, SheetName:=Sheets("MAIN").Range("D17").Value, Sep:=Sheets("MAIN").Range("B30").Value
ImportDataFile FileName:=Sheets("MAIN").Range("B3").Value + "\" + Sheets("MAIN").Range("B18").Value + "\" + Sheets("MAIN").Range("C18").Value, SheetName:=Sheets("MAIN").Range("D18").Value, Sep:=Sheets("MAIN").Range("B30").Value
ImportDataFile FileName:=Sheets("MAIN").Range("B3").Value + "\" + Sheets("MAIN").Range("B19").Value + "\" + Sheets("MAIN").Range("C19").Value, SheetName:=Sheets("MAIN").Range("D19").Value, Sep:=Sheets("MAIN").Range("B30").Value
ImportDataFile FileName:=Sheets("MAIN").Range("B3").Value + "\" + Sheets("MAIN").Range("B20").Value + "\" + Sheets("MAIN").Range("C20").Value, SheetName:=Sheets("MAIN").Range("D20").Value, Sep:=Sheets("MAIN").Range("B30").Value
ImportDataFile FileName:=Sheets("MAIN").Range("B3").Value + "\" + Sheets("MAIN").Range("B21").Value + "\" + Sheets("MAIN").Range("C21").Value, SheetName:=Sheets("MAIN").Range("D21").Value, Sep:=Sheets("MAIN").Range("B30").Value
ImportDataFile FileName:=Sheets("MAIN").Range("B3").Value + "\" + Sheets("MAIN").Range("B22").Value + "\" + Sheets("MAIN").Range("C22").Value, SheetName:=Sheets("MAIN").Range("D22").Value, Sep:=Sheets("MAIN").Range("B30").Value
ImportDataFile FileName:=Sheets("MAIN").Range("B3").Value + "\" + Sheets("MAIN").Range("B23").Value + "\" + Sheets("MAIN").Range("C23").Value, SheetName:=Sheets("MAIN").Range("D23").Value, Sep:=Sheets("MAIN").Range("B30").Value
ImportDataFile FileName:=Sheets("MAIN").Range("B3").Value + "\" + Sheets("MAIN").Range("B24").Value + "\" + Sheets("MAIN").Range("C24").Value, SheetName:=Sheets("MAIN").Range("D24").Value, Sep:=Sheets("MAIN").Range("B30").Value
ImportDataFile FileName:=Sheets("MAIN").Range("B3").Value + "\" + Sheets("MAIN").Range("B25").Value + "\" + Sheets("MAIN").Range("C25").Value, SheetName:=Sheets("MAIN").Range("D25").Value, Sep:=Sheets("MAIN").Range("B30").Value
ImportDataFile FileName:=Sheets("MAIN").Range("B3").Value + "\" + Sheets("MAIN").Range("B26").Value + "\" + Sheets("MAIN").Range("C26").Value, SheetName:=Sheets("MAIN").Range("D26").Value, Sep:=Sheets("MAIN").Range("B30").Value
Sheets("MAIN").Select
Sheets("C-List").Select
'ClearClipboard 'for fast computers with Win 7
End Sub
Zobrazeno 14 zpráv z 14.