Stránka 1 z 1

Excel VBA Zrychlení práce s řetězcem

Napsal: 19 říj 2011 11:36
od Pavel1234
Dobrý den,
Potřeboval bych poradit jak rychleji rozhodit CSV řetězec do sloupců
Používám následující blok kodu ale je to velmi pomalé
Propojení nemohu použít a tak data načítám po řádcích z TextStreamu.
Příklad:

Kód: Vybrat vše

            strRadek = "0,25809;2;184;2;8;03;00;ae;ef;c5;0e;91;00;2"

            Cells(lngListRadek, 1) = CDbl(Left(strRadek, InStr(1, strRadek, ";") - 1))
            strRadek = Right(strRadek, Len(strRadek) - InStr(1, strRadek, ";"))
            Cells(lngListRadek, 2) = Val(Left(strRadek, InStr(1, strRadek, ";") - 1))
            strRadek = Right(strRadek, Len(strRadek) - InStr(1, strRadek, ";"))
            Cells(lngListRadek, 3) = "'" & Left(strRadek, InStr(1, strRadek, ";") - 1)
            strRadek = Right(strRadek, Len(strRadek) - InStr(1, strRadek, ";"))
            Cells(lngListRadek, 4) = Val(Left(strRadek, InStr(1, strRadek, ";") - 1))
            strRadek = Right(strRadek, Len(strRadek) - InStr(1, strRadek, ";"))
            Cells(lngListRadek, 5) = Val(Left(strRadek, InStr(1, strRadek, ";") - 1))
            strRadek = Right(strRadek, Len(strRadek) - InStr(1, strRadek, ";"))
            Cells(lngListRadek, 6) = "'" & Left(strRadek, InStr(1, strRadek, ";") - 1)
            strRadek = Right(strRadek, Len(strRadek) - InStr(1, strRadek, ";"))
            Cells(lngListRadek, 7) = "'" & Left(strRadek, InStr(1, strRadek, ";") - 1)
            strRadek = Right(strRadek, Len(strRadek) - InStr(1, strRadek, ";"))
            Cells(lngListRadek, 8) = "'" & Left(strRadek, InStr(1, strRadek, ";") - 1)
            strRadek = Right(strRadek, Len(strRadek) - InStr(1, strRadek, ";"))
            Cells(lngListRadek, 9) = "'" & Left(strRadek, InStr(1, strRadek, ";") - 1)
            strRadek = Right(strRadek, Len(strRadek) - InStr(1, strRadek, ";"))
            Cells(lngListRadek, 10) = "'" & Left(strRadek, InStr(1, strRadek, ";") - 1)
            strRadek = Right(strRadek, Len(strRadek) - InStr(1, strRadek, ";"))
            Cells(lngListRadek, 11) = "'" & Left(strRadek, InStr(1, strRadek, ";") - 1)
            strRadek = Right(strRadek, Len(strRadek) - InStr(1, strRadek, ";"))
            Cells(lngListRadek, 12) = "'" & Left(strRadek, InStr(1, strRadek, ";") - 1)
            strRadek = Right(strRadek, Len(strRadek) - InStr(1, strRadek, ";"))
            Cells(lngListRadek, 13) = "'" & Left(strRadek, InStr(1, strRadek, ";") - 1)
            strRadek = Right(strRadek, Len(strRadek) - InStr(1, strRadek, ";"))
            Cells(lngListRadek, 14) = strRadek


Díky za nápady
Pavel

Re: Excel VBA Zrychlení práce s řetězcem

Napsal: 24 říj 2011 13:53
od franticek
Ahoj.
Předpokládám, že máš vypnutý refresh buněk během chodu funkce.
Zkus použít načítání po řádku do řádcích a pak jednotlivé řádky rozdělit po slovech do pole pomocí funkce Split, kde zadáš string a znak, který je použit jako oddělovač.

Re: Excel VBA Zrychlení práce s řetězcem

Napsal: 25 říj 2011 13:11
od Pavel1234
Ahoj
Refresh mám vypnutý. Proměnou strRadek plnim pres TextStream.ReadLine. Řádek má vždy 14 hodnot.
V podstatě rozgěluji jeden velký textový soubor do více excel souborů.
Rozhození pomocí následujícího kodu je pomelejší než původní konstrukce

Kód: Vybrat vše

    Pole = Split(strRadek, ";")
           
            For I = 0 To 13
                Cells(lngListRadek, I + 1) = Pole(I)
            Next I


Pavel

Re: Excel VBA Zrychlení práce s řetězcem

Napsal: 26 říj 2011 18:00
od guest
Mno... nejdřív bych začal nástrojem Data / Text do sloupců. Tentýž nástroj se používá i pro import dat z textových zdrojů. Jinak cest k přístupu CSV je docela dost. Pokud zůstanete u čtení po řádcích, pak uvedený Split, Worksheetfunction.Transpose, překlápění pole do listu, ...

Re: Excel VBA Zrychlení práce s řetězcem

Napsal: 27 říj 2011 10:53
od Pavel1234
OK.
Zkusím funkci Transpose.
Jinak mám pocit, že mi nic jiného než čtení po řádcích nezbývá. Počet řádků v souboru jsou desítky milionů a velikost je v GigaBytech.
Takže i nepatrný čas učetřený na zpracování řádku má smysl.

Re: Excel VBA Zrychlení práce s řetězcem

Napsal: 07 lis 2011 17:17
od franticek
Zdravím.

Ještě mne napadla taková možnost - co to nejprve rozsekat do souborů po rozumném počtu řádků tak, aby se vešly na jeden sheet a zároveň i do operační paměti a pak to zpracovat po celých jednotlivých souborech pomocí některé se zmíněných hromadných metod?