IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Michal Kotalik:25.8.2021 12:38

Dobrý den,
jsem nováček v sql a potřeboval bych radu.
Mám cca 130 csv souborů a potřeboval bych je hromadně naimportovat do MS SQL Server. A potřeboval bych, aby se jednotlivé soubory řadily za sebe do sloupců a ne pod sebe do řádků.

Zdroj:
Soubor1
2
3
8
Soubor2
3
6
4
Soubor3
9
7
4

Výsledek:
Soubor
2,3,9 ………..
3,6,7 ………..
8,4,4 ………..

Předem děkuji za radu.

 
Odpovědět
25.8.2021 12:38
Avatar
Petan
Člen
Avatar
Petan:25.8.2021 18:51

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

 
Nahoru Odpovědět
25.8.2021 18:51
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:25.8.2021 19:59

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

 
Nahoru Odpovědět
25.8.2021 19:59
Avatar
Odpovídá na Peter Mlich
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.

 
Nahoru Odpovědět
26.8.2021 12:39
Avatar
Petan
Člen
Avatar
Petan:26.8.2021 15:28

A to jako skutecne potrebujes tabulku o 8000 sloupcich? Mam pocit ze MS SQL tabulka ma max 1024 sloupcu

 
Nahoru Odpovědět
26.8.2021 15:28
Avatar
Odpovídá na Petan
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.

 
Nahoru Odpovědět
27.8.2021 18:19
Avatar
Petan
Člen
Avatar
Petan:30.8.2021 13:40

A co takhle tabulku o 3 sloupcich 1. cas (id zaznamu) 2. poradi hodnoty 3. hodnota

 
Nahoru Odpovědět
30.8.2021 13:40
Avatar
Petan
Člen
Avatar
Petan:30.8.2021 13:53

No jeste by byla moznost pouzit slouec XML COLUMN_SET FOR ALL_SPARSE_COLUMNS viz XML ale ja jsem to nikdy nepouzil tak nevim

 
Nahoru Odpovědět
30.8.2021 13:53
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:30.8.2021 15:04

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 :)

 
Nahoru Odpovědět
30.8.2021 15:04
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:30.8.2021 15:06

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.

 
Nahoru Odpovědět
30.8.2021 15:06
Avatar
JerryM
Člen
Avatar
Odpovídá na Michal Kotalik
JerryM:8.9.2021 8:11

hm na internetu je o tom spousta manuálů

https://qawithexperts.com/…ry-using/265

 
Nahoru Odpovědět
8.9.2021 8:11
Avatar
Petan
Člen
Avatar
Odpovídá na JerryM
Petan:9.9.2021 11:33

BULK INSERT je reseni ale otazka je co udelat z 8000 sloupci ?

 
Nahoru Odpovědět
9.9.2021 11:33
Avatar
JerryM
Člen
Avatar
JerryM:9.9.2021 12:34

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
 
Nahoru Odpovědět
9.9.2021 12:34
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 14 zpráv z 14.