Import wybranych wierszy i kolumn z pliku TXT do Calc

Dyskusje dotyczące tworzenia makropoleceń, pisania skryptów oraz programowania przy użyciu UNO
idzi
Posty: 22
Rejestracja: pt mar 26, 2010 11:20 am

Import wybranych wierszy i kolumn z pliku TXT do Calc

Post autor: idzi »

Co prawda podobny temat istnieje: http://forum.openoffice.org/pl/forum/vi ... f=27&t=913 ale potrzebuję oprócz wskazania wiersza zdefiniować również odpowiedni zakres kolumn do wczytania.
Czyli np. wiersze od 3 do 6 i w każdym z tych wierszy znaki na pozycji (w kolumnie) od 5 do 8.
Jak to zrealizować w przedstawionym w przytoczonym temacie makrze?

Kod: Zaznacz cały

    'const FILEOPEN_SIMPLE = 0
    'const FILESAVE_SIMPLE = 1

    sub czytajUstawienia()
        ' wybiera plik przez okno dialogowe i wczytuje z niego wybrane wiersze do arkusza '
        nazwapliku = OOoFileOpenDialog("", "Czytaj plik")
        if nazwapliku <> "" then
            czytajUstawieniaZPliku(nazwapliku)
        endif
    end sub

    function OOoFileOpenDialog(fname, title) as string
        ' definiuje okno dialogowe wyboru pliku via OOo '
        picker = CreateUnoService( "com.sun.star.ui.dialogs.FilePicker" )
        picker.setDisplayDirectory("file:///" & fname)
        picker.setTitle(title)
        if picker.execute() then
            fname = picker.Files(0)
        else
            fname = ""
        endif
        OOoFileOpenDialog = fname
    end function

    sub listaNaArkusz(lista, pierwszy, ostatni, arkusz, kolumna, wiersz)
        ' wstawia elementy listy do wybranej kolumny arkusza, począwszy od wskazanego wiersza '
        for i = pierwszy to ostatni
            x = lista(i)
            arkusz.getCellByPosition(kolumna, wiersz).setString(x)
            wiersz = wiersz + 1
        next i
    end sub

    sub czytajUstawieniaZPliku(nazwapliku)
        ' wczytuje wybrane wiersze ze wskazanego pliku do arkusza
        ' nazwapliku: url czytanego pliku
        p = FreeFile
        open nazwapliku for input as #p
        zawartosc = ""
        Do While not eof(p)
           Line Input #p, msg
           zawartosc = zawartosc & msg & "#13"
        Loop
        close #p
        zawartosc = split(zawartosc, "#13")
    '    # zakres wierszy do uwzględnienia
        pierwszy = 3
        ostatni = 6
    '    # na który arkusz
        ark = thisComponent.Sheets.getByIndex(0)
    '    # w które miejsce arkusza
        kol = 0
        wiersz = 1
        listaNaArkusz(zawartosc, pierwszy, ostatni, ark, kol, wiersz)
    end sub
Ostatnio zmieniony sob wrz 21, 2013 11:39 pm przez idzi, łącznie zmieniany 1 raz.
OpenOffice 4.0 / LibreOffice 4.1
belstar
Posty: 654
Rejestracja: czw mar 17, 2011 9:08 am

Re: Import wybranych wierszy i kolumn z pliku TXT do Calc

Post autor: belstar »

idzi pisze:Czyli np. wiersze od 3 do 6 i w każdym z tych wierszy znaki na pozycji (w kolumnie) od 5 do 8.
Zmodyfikowane makra mogły by wyglądać jak niżej, ale nie całkiem rozumie kolumny czy w arkuszu czy w tekscie.

Kod: Zaznacz cały

 		sub czytajUstawienia()
            ' wybiera plik przez okno dialogowe i wczytuje z niego wybrane wiersze do arkusza '
            nazwapliku = OOoFileOpenDialog("/home", "Czytaj plik")
            if nazwapliku <> "" then
                czytajUstawieniaZPliku(nazwapliku)
            endif
        end sub

        function OOoFileOpenDialog(fname, title) as string
            ' definiuje okno dialogowe wyboru pliku via OOo '
            picker = CreateUnoService( "com.sun.star.ui.dialogs.FilePicker" )
            picker.setDisplayDirectory(ConvertToURL( "/" ) & fname)
            picker.setTitle(title)
            if picker.execute() then
                fname = picker.Files(0)
            else
                fname = ""
            endif
            OOoFileOpenDialog = fname
        end function

        sub listaNaArkusz(lista, pierwszy, ostatni, arkusz, kolumna, wiersz, kol_start, kol_end, split_znak)
            ' wstawia elementy listy do wybranej kolumny arkusza, począwszy od wskazanego wiersza '
            for i = pierwszy to ostatni
                x = lista(i)
                x = rozdzielKolumny(x, kol_start, kol_end, split_znak)
                arkusz.getCellByPosition(kolumna, wiersz).setString(x)
                wiersz = wiersz + 1
            next i
        end sub

        sub czytajUstawieniaZPliku(nazwapliku)
            ' wczytuje wybrane wiersze ze wskazanego pliku do arkusza
            ' nazwapliku: url czytanego pliku
            p = FreeFile
            open nazwapliku for input as #p
            zawartosc = ""
            Do While not eof(p)
               Line Input #p, msg
               zawartosc = zawartosc & msg & "#13"
            Loop
            close #p
            zawartosc = split(zawartosc, "#13")
        '    # zakres wierszy do uwzględnienia
            pierwszy = 1
            ostatni = 8
        '    # na który arkusz
            ark = thisComponent.Sheets.getByIndex(0)
        '    # w które miejsce arkusza
            kol = 0
            wiersz = 0
        '	 # która kolumna do wczytania pierwsza i ostatnia
        	kol_pierwsza = 5
        	kol_ostatnia = 8
        '	 # znak rozdzielający kolumny, dostosuj
        	split_chr = ","    
            listaNaArkusz(zawartosc, pierwszy, ostatni, ark, kol, wiersz, kol_pierwsza, kol_ostatnia, split_chr)
        end sub
		Function rozdzielKolumny(Linia_listy, kol_first, kol_last, split_chr)
			'wyodrębnia wskazane kolumny	
			x = Split(linia_listy, split_chr)
			for i = kol_first - 1 to kol_last - 1
				y = y & x(i) & " "
			next
			rozdzielKolumny = y
		End Function
W rozwiązaniu przyjąłem że chodzi o kolumny w teksie (fragment tekstu)
Zmodyfikuj sobie wszystkie zmienne.
LibreOffice 5.1.2.2 Ubuntu 16 LTS
idzi
Posty: 22
Rejestracja: pt mar 26, 2010 11:20 am

Re: Import wybranych wierszy i kolumn z pliku TXT do Calc

Post autor: idzi »

Dzięki za pomoc, ale nie do końca mi o to chodziło chociaż to rozwiązanie również się przyda :)
W kodzie, który podałeś muszę zdefiniować znak rozdzielający kolumny w pliku, który chcę wczytać ale niestety nie mam takich znaków.
mój plik tekstowy wygląda np. tak:

A1B1C1D1E1F1G1H1
A2B2C2D2E2F2G2H2
A3B3C3D3E3F3G3H3
A4B4C4D4E4F4G4H4
A5B5C5D5E5F5G5H5
A6B6C6D6E6F6G6H6
A7B7C7D7E7F7G7H7
A8B8C8D8E8F8G8H8
A9B9C9D9E9F9G9H9

I teraz chcę wczytać do arkusza dane od 3 do 6 wiersza i kolumny (pozycje w wierszu) od 5 do 9 (obszar zaznaczony na czerwono)
w wyniku tego powinienem otrzymać w arkuszu coś takiego:

C3D3E
C4D4E
C5D5E
C6D6E

Oczywiście w pliku do wczytania będą również występowały przecinki spacje itp ale powinny one być traktowane jak inne znaki a nie znaki rozdzielające.
Mam nadzieję, że teraz widać o co mi chodziło.
OpenOffice 4.0 / LibreOffice 4.1
belstar
Posty: 654
Rejestracja: czw mar 17, 2011 9:08 am

Re: Import wybranych wierszy i kolumn z pliku TXT do Calc

Post autor: belstar »

Musisz wykorzystać funkcje MID() poniżej przykład

Kod: Zaznacz cały

Sub Main
zmienna = "A3B3C3D3E3F3G3H3"
zmienna = Mid(zmienna, 5, 5)
print zmienna 'wynik C3D3E
End Sub
LibreOffice 5.1.2.2 Ubuntu 16 LTS
belstar
Posty: 654
Rejestracja: czw mar 17, 2011 9:08 am

Re: Import wybranych wierszy i kolumn z pliku TXT do Calc

Post autor: belstar »

I poniżej zmodyfikowana funkcja z pierwszego postu

Kod: Zaznacz cały

 sub listaNaArkusz(lista, pierwszy, ostatni, arkusz, kolumna, wiersz)
            ' wstawia elementy listy do wybranej kolumny arkusza, począwszy od wskazanego wiersza '
            for i = pierwszy to ostatni
                x = Mid(lista(i), 5, 5)
                arkusz.getCellByPosition(kolumna, wiersz).setString(x)
                wiersz = wiersz + 1
            next i
        end sub
LibreOffice 5.1.2.2 Ubuntu 16 LTS
idzi
Posty: 22
Rejestracja: pt mar 26, 2010 11:20 am

Re: Import wybranych wierszy i kolumn z pliku TXT do Calc

Post autor: idzi »

Dzięki o to właśnie chodziło.
A co zrobić aby wczytane wartości w poszczególne komórki arkusza były traktowane jak liczby, bo teraz po uruchomieniu makra wczytane liczby są kwalifikowane jako tekst.
OpenOffice 4.0 / LibreOffice 4.1
belstar
Posty: 654
Rejestracja: czw mar 17, 2011 9:08 am

Re: Import wybranych wierszy i kolumn z pliku TXT do Calc

Post autor: belstar »

idzi pisze:C3D3E
Trudno przekształcić taki ciąg na liczbę.

Spis funkcji konwertujących:
  1. CInt
  2. CLng
  3. CSng
  4. Val
przykład użycia:

Kod: Zaznacz cały

sub test
zmienna = "12345" ciąg tekstowy
zmienna = Val(zmnienna)
'wynik 12345
end sub
Ponadto musisz zmienić setString na setValue
LibreOffice 5.1.2.2 Ubuntu 16 LTS
idzi
Posty: 22
Rejestracja: pt mar 26, 2010 11:20 am

Re: Import wybranych wierszy i kolumn z pliku TXT do Calc

Post autor: idzi »

Przykład z literami i liczbami był tylko poglądowy, w rzeczywistości pobieram liczbę z pliku CSV generowanego przez inny program, przy czym ten CSV nie ma wiele wspólnego z typowym CSV i dlatego wynikła potrzeba wczytania według zakresu wierszy/kolumna.
Tak więc wczytuję w poszczególne komórki liczby typu:

0,000
0,021
0,025

które po wczytaniu do arkusza są traktowane jako tekst - np nie są brane jako wartości liczbowe do wykresu.
Na razie robię tak, że to co wczytałem z pliku za pomocą makra mnożę razy 1 do innych kolumn i otrzymuję liczby.
Działa i jest OK ale ładniej by było jakby makro od razu wczytywało jako liczby.
Czy powinienem w tym przypadku zmodyfikować funkcje w ten sposób:

Kod: Zaznacz cały

        sub listaNaArkusz(lista, pierwszy, ostatni, arkusz, kolumna, wiersz)
            ' wstawia elementy listy do wybranej kolumny arkusza, począwszy od wskazanego wiersza '
            for i = pierwszy to ostatni
                x = Mid(lista(i), 5, 5)
             'zmiana pobranych znaków na liczbę
                x = Val(x) 
                arkusz.getCellByPosition(kolumna, wiersz).setString(x)
                wiersz = wiersz + 1
            next i
        end sub
OpenOffice 4.0 / LibreOffice 4.1
Jan_J
Posty: 4653
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Import wybranych wierszy i kolumn z pliku TXT do Calc

Post autor: Jan_J »

x = Val(x)
cell.SetValue(x) ' zamiast SetString
JJ
LO (26.2) ∙ Python (3.13|3.10) ∙ Unicode 17 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
idzi
Posty: 22
Rejestracja: pt mar 26, 2010 11:20 am

Re: Import wybranych wierszy i kolumn z pliku TXT do Calc

Post autor: idzi »

Teraz jest OK.
Zmieniłem tylko:
x = Val(x)
na
x = CSng(x)
bo miałem do wczytania ułamki.
OpenOffice 4.0 / LibreOffice 4.1
idzi
Posty: 22
Rejestracja: pt mar 26, 2010 11:20 am

Re: Import wybranych wierszy i kolumn z pliku TXT do Calc

Post autor: idzi »

Problem rozwiązany, makro działa.
Dziękuję wszystkim za cierpliwość :)
OpenOffice 4.0 / LibreOffice 4.1
ODPOWIEDZ