< návrat zpět

MS Excel


Téma: CSV - makro na uložení s různým počtem ; rss

Zaslal/a 31.8.2018 10:22

Dobrý den,
mám CSV, které má na prvním řádku jiný počet sloupců než je od druhého dále.

111;22
aaa;bbb;ccc;ddd;eee;fff

Pokud použiji :

ActiveWorkbook.SaveAs s Local:=True, tak mám problém s prvním řádku, excel doplní středníky.

111;22;;;;
aaa;bbb;ccc;ddd;eee;fff

Jak zachovat první řádek?

Zaslat odpověď >

Strana:  1 2   další »
#041377
elninoslov
Neviem, či je možné rovno v Exporte Excelu urobiť rozdielny počet stĺpcov, no tu sú dva príklady:
Sub ExportCSV()
Dim F As Object, Prvy As Integer, Ostatne As Integer, Riadkov As Long, i As Long, x As Integer, rngUsed As Range, D(), S As String
Const DEL = ";"

With ActiveSheet
Prvy = .Cells(1, .Columns.Count).End(xlToLeft).Column
Set rngUsed = .UsedRange
Ostatne = Intersect(rngUsed, rngUsed.Offset(1, 0)).Columns.Count
With rngUsed
Riadkov = .Rows.Count
ReDim D(1 To Riadkov, 1 To .Columns.Count)
D = .Value
End With
End With

Set F = CreateObject("Scripting.FileSystemObject").CreateTextFile("D:\CSVExport.csv", True, True)
For i = 1 To Riadkov
S = vbNullString
For x = 1 To IIf(i = 1, Prvy, Ostatne)
S = S & IIf(S = vbNullString, vbNullString, DEL) & D(i, x)
Next x
F.Writeline S
Next i

Set F = Nothing: Set rngUsed = Nothing
End Sub


Sub ExportCSV2()
Dim Prvy As Integer, Ostatne As Integer, Riadkov As Long, i As Long, x As Integer, rngUsed As Range, D(), S As String, Pole() As String
Const DEL = ";"

With ActiveSheet
Prvy = .Cells(1, .Columns.Count).End(xlToLeft).Column
Set rngUsed = .UsedRange
Ostatne = Intersect(rngUsed, rngUsed.Offset(1, 0)).Columns.Count
With rngUsed
Riadkov = .Rows.Count
ReDim D(1 To Riadkov, 1 To .Columns.Count)
D = .Value
End With
End With

ReDim Pole(Riadkov - 1)
For i = 1 To Riadkov
S = vbNullString
For x = 1 To IIf(i = 1, Prvy, Ostatne)
S = S & IIf(S = vbNullString, vbNullString, DEL) & D(i, x)
Next x
Pole(i - 1) = S
Next i

With CreateObject("ADODB.Stream")
.Open
.Charset = "UTF-8"
.WriteText Join(Pole, vbCrLf)
.SaveToFile "D:\CSVExport.csv", 2
.Close
End With

Set rngUsed = Nothing
End Sub


Má to ale jedno podstatné ALE. Už X-krát omieľané kódovanie UTF-8 v CSV a BOM. Prvý kód neurobí UTF-8 ale nejaké "UCS-2 LE BOM". Druhý kód urobí "UTF-8 BOM". To BOM sú 3 bajty v súbore, ktoré robia šarapatu pri importoch do rôznych systémov. Vyskúšajte, alebo sa inšpirujte pri hľadaní iného riešenia.

Možno klasickým exportom urobiť CSV, to v makre otvoriť ako text, zmazať v prvom riadku všetky ";" sprava po najbližší znak a súbor znovu uložiť. Ale zase to ALE, lebo ak by sa Vám aj podaril Export do UTF-8 bez BOM, tak takéto uloženie to opäť degraduje.

Možno má niekto niečo použiteľnejšie.citovat
#041379
avatar
To CSV dostanu, provedu nějaké změny (zrušení mezer apod.) a uložím. Neovlivním tedy export a formát zdroje.
Pokud cokoliv smažu, tak znovu uložením mám středníky zpět.
BOM je stejný problém jako ty středníky - neprojde to následným zpracováním, které již zase neřeším já.
Proč to tam ten excel doplňuje... :-(citovat
#041383
elninoslov
To je predsa logické, že Vám tam dá znovu oddeľovače. Veď predsa použijete stále rovnaký polyfunkčný exportovací systém.

Použite tú druhú metódu, čo som postol, potom čo urobíte požadované úpravy v dátach (možno aj tie by sa dali zautomatizovať makrom). Žiaľ nevieme aké typy dát sú v stĺpcoch, koľko ich je, a aký požadovaný formát majú mať napr. dátumy či desatinné čísla. Toto si ošetríte pre požadované polia v tom cykle x napr cez Select Case x.

Dostanete z toho požadované CSV UTF-8 BOM, bez nadbytočných oddeľovačov s prvom riadku.

Toho BOM sa ľahúčko zbavíte v NotePad++ asi za 4 sekundy (menu Kódovanie - Kódovať v UTF-8 bez BOM - Uložiť).

Ak to robíte často, makro si môžete dať ako doplnok do lišty v Exceli, len teda otvoríte CSV, urobíte úpravy (alebo ak budú automatizovateľné makrom, tak ručne nemusíte), stlačíte čudlík a vytvorí sa nový CSV, ktorý sa môže už rovno v NotePad++ otvoriť a len čaká na Vaše 3 kliky.

Kým sa nepríde na lepší systém priamo v Exceli, myslím, že by to bolo prijateľné.citovat
#041393
avatar
Zdravím,
to jsme si asi nerozuměli.
Jako zdroj dostanu na úložiště CSV. Mám nastavený win scheduler pomocí kterého spustím makro a to provede úpravy a přeuloží CSV (je jich více). Následný load spadne na středníky, které si tam při uložení přidal excel (úpravy jsou od 2. řádku).
Přes notepad mohu odmazat ty středníky stejně jako BOM, bohužel to běží kolem půlnoci a už to nebude automat :-).

Doufal jsem, že to půjde nějak jednoduše ošetřit.
Nějaká složitější řešení mě i napadla...
Složit si CSV
1. command - Shell("copy header.txt + body.csv finalfile.txt", 1)
2. něco jak píšete vy = vyrobit nové CSV z toho původního
3. přes dtb - nahrát do tbl a exportovat
Nicméně to nejsou ideální řešení z mnoha důvodů...
Ale i tak díkycitovat
icon #041394
eLCHa
Upřímně
Provádět úpravy csv souboru pomocí excelu není moudré. A to proto, že excel si prostě provede ještě svoje úpravy, které nechcete.

To znamená - buď nějaký skript (podíval bych se, co všechno umí Shell nebo PowerShell), VBS nebo klidně makro, ale nemělo by dojít k otevření a uložení v excelu, ale pouze úpravám uvnitř (jedná se o textový soubor - na to není potřeba otevírat v excelu). Já si tímto způsobem z CSV odstraňuji první řádek.

Píšete jen - nějaké změny. Záleží co jsou to za změny.citovat
#041395
avatar
"Provádět úpravy csv souboru pomocí excelu není moudré." Pobavil jste mě, nic ve zlém... :-)

Od Win7 je powershell součástí, takže lze pustit příkaz:
powershell -Command "(gc in.csv) -replace ';;;;', '' | Out-File out.csv

Máte ale radu pro ", VBS nebo klidně makro, ale nemělo by dojít k otevření a uložení v excelu, ale pouze úpravám uvnitř" citovat
icon #041396
eLCHa
Pobavil jste mě, nic ve zlém... :-)

Jsem rád, ale docela by mně zajímalo čím. Nevím co máte za verzi excelu (nedávno tu řešil xlnc) - ale pokud je originál v UTF8 bez BOM - umíte ho stejně uložit v excelu? Toto je totiž pro mnoho programů zásadní problém - prostě pokud to má sloužit jako import, po úpravě v excelu se vám to velmi často nepovede. A to nemluvím o dalších problémech, jako chybný import číselných oddělovačů atp (když se vám z 1 koruny stane 40000 a ani si toho nevšimnete ;) ) . No - nedělám to ;)))

Ta rada je skrytá ve větě
jedná se o textový soubor - na to není potřeba otevírat v excelu
Způsobů je více => Hledejte například OpenTextFile pro FileSystemObject nebo Open FilePath For Mode As FileNumber

Já vím, že PowerShell je součástí - jinak bych vám ho tu nenavrhoval.citovat
#041397
avatar
Aktualizace PS (jinak to také rozhodí...)
powershell -Command "(gc in.csv) -replace ';;;;;;;;;;;;', '' | Out-File -Encoding default out.csv

OpenTextFile jsem zkoušel na začátku, ale po úpravách mi z nějakého důvodu nedodržel moje nastavení (středník vs. čárka, formát data atd.). Proto jsem šel cestou SaveAs s local:=True. Abychom ale jen neteoretizovali, tak přikládám funkční kód, pro ty středníky:

Sub PrepsatStredniky()
Const ForReading = 1
Const ForWriting = 2

strSoubor = ThisWorkbook.Path & "\in.csv"
strOldText = ";;;;"
strNewText = ""

Set objFSO = CreateObject "Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(strSoubor, ForReading)

strText = objFile.ReadAll
objFile.Close

strNewText = Replace(strText, strOldText, strNewText)

Set objFile = objFSO.OpenTextFile(strSoubor, ForWriting)

objFile.WriteLine strNewText
objFile.Close

End Sub
citovat
#041398
avatar

Martinxlsm napsal/a:

..... Abychom ale jen neteoretizovali, tak přikládám funkční kód, pro ty středníky:......

No keď je to funkčné, tak čo tu stále riešiš? Potrebuješ sa pochváliť alebo čo?citovat
icon #041399
eLCHa
@Martinxlsm

Prosím, pro lepší čitelnost kód vkládejte do tagu code (to je ten $) - děkuji

S tímhle bych byl opatrný:powershell -Command "(gc in.csv) -replace ';;;;;;;;;;;;'Pokud rozumím, chcete nahradit pouze v prvním řádku.

@marjankaj
Je lepší, že je sem vložen funkční kód - třeba to někdo někdy využije a nebude se ptát, jak to dopadlo.citovat

Strana:  1 2   další »

Uživatelské menu

Nejste přihlášen(a)
avatar\n

Menu

On-line nástroje

Formulář Faktura

Formulář Faktura IV

Oblíbený formulář Faktura byl vylepšen a rozšířen.
Více se dočtete zde.

Aktivní diskuse

odpocet a storno tl.

PavDD • 28.3. 8:53

odpocet a storno tl.

Začátečník • 26.3. 14:39

odpocet a storno tl.

PavDD • 26.3. 10:22

odpocet a storno tl.

elninoslov • 26.3. 7:50

odpocet a storno tl.

PavDD • 26.3. 7:26

odpocet a storno tl.

elninoslov • 25.3. 22:34

odpocet a storno tl.

Začátečník • 25.3. 15:09