Elektroda.pl
Elektroda.pl
X
Elektroda.pl
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

EXCEL - Import danych z plików CSV

10 Mar 2015 09:29 993 7
  • Poziom 7  
    Witam,

    Proszę o pomoc w napisaniu prostego makra które będzie działać zgodnie z poniższym opisem:

    Na dysku C:\ znajduje się folder BAZA, a w nim siedem plików CSV o nazwach 1.csv, 2.csv, 3.csv, 4.csv, 5.csv, 6.csv, 7.csv. Wszystkie pliki mają tą samą konstrukcję i wiersz nagłówkowy - różnią się jedynie wartościami danych w poszczególnych kolumnach.

    Wynikiem działania makra ma być jedna globalna tabela, która będzie "zbitkiem" poszczególnych tabel składowych z plików CSV, zawierająca jeden wiersz nagłówkowy.

    Do dzisiaj sklejałem te pliki ręcznie, ale zaczyna to być uciążliwe. Pliki składowe nie zawierają dużych ilości danych, jest w nich max 300 wierszy. Ale bez względu na to, codziennie wymaga to ode mnie klikologii która zaczyna być męcząca.

    Czy ktoś z Was rozwiązywał już podobny problem i udało mu się napisać poprawnie działające makro realizujące tą czynność ? Z problemem porządkowania danych i sortowania ich w "zbitej" tabeli poradzę sobie we własnym zakresie, więc chodzi tylko o aspekt importu i agregowania danych do jednej tabeli.
  • Poziom 22  
    Dzień dobry. Przyszło mi do głowy takie "niemakrowe" rozwiązanie.

    Konsolowa funkcja do kopiowania plików w Windowsie pozwala je łączyć.
    Jeśli w konsoli wpiszesz
    Code:
    copy *.csv wynikowy.csv

    to powstanie Ci plik wynikowy.csv posklejany z reszty plików csv w tym folderze.
  • Poziom 7  
    Sprawdziłem - z poziomu konsoli faktycznie można sprawnie łączyć pliki, ale niestety taka opcja wplata w tabele taką ilość wierszy nagłówkowych ile plików będzie w katalogu. Nie ukrywam że ułatwia to nieco pracę, ale może jest jakieś rozwiązanie które pozwoli osiągnąć dokładnie taki efekt jakiego szukam.
  • Poziom 22  
    Rozumiem. Ulepszam pomysł :) Jeśli chcesz się pozbyć nagłówków to zrób takim poleceniem, gdzie:
    +1 oznacza, że obcinany będzie pierwszy wiersz

    Code:
    for /r %i in (*.csv) do more +1<%i>>wynik.tmp
    
    ren wynik.tmp wynik.csv


    edit: obcięte wyniki zebrałem najpierw w pliku tmp, żeby przy każdej iteracji nie uwzględniał się w pętli
  • Specjalista - VBA, Excel
    Zrobić 7 kwerendy do plików, jeden pod drugim, pierwszy z nagłówkami, reszta bez nich
  • Poziom 7  
    OK, faktycznie działa. Skoro więc zarzucamy temat makra, i korzystamy z konsoli to jeszcze jedna sprawa: czy jest szansa żeby w składni polecenia łączącego pliki w całość zawrzeć warunek, który będzie pomijał ostatni wiersz każdego pliku CSV. W plikach źródłowych ostatni wiersz jest podsumowaniem, które nie jest mi potrzebne i które również trzeba ręcznie usuwać. O ile usunięcie pierwszego wiersza wydaje się relatywnie proste, o tyle usuwanie ostatniego wiersza (którego położenie może być różne) nie jest już tak oczywiste ;)
  • Pomocny post
    Poziom 22  
    Oczywiście. Co prawda w batchu też by się dało ale wygodniej zrobić to PowerShellem. Wtedy można to zupełnie zautomatyzować.
    Np.:

    Code:
    foreach ($i in get-childitem *.csv) {
    
    if ($i.name -eq "1.csv") {(get-content $i)[0..((get-content $i).count-1)]|add-content wynik.csv}
    else {(get-content $i)[1..((get-content $i).count-1)]|add-content wynik.csv}}


    możesz kod zapisać jako plik ze skryptem (powershell ma rozszerzenie .ps1)

    objaśnienie linijek:
    1) zbiera listę wszystkich csv w folderze w którym mamy skrypt
    2) z pierwszego pliku np.: "1.csv" pobieraj nagłówek (czyli od linijki "[0.. ") oraz pomijaj ostatni wiersz z podsumowaniem (czyli ".count-1)]")
    3) z pozostałych plików pomijaj nagłówek i stopkę (czyli od "[1..", do ".count-1)]")

    wynik dopisywany będzie do pliku wynik.csv

    Skrypcik będzie działał na każdym pliku (nie musi to być csv). Jeśli chciałbyś dostawać się do konkretnych danych (np. filtrować wartości, uwzględniać jakieś przedziały czasowe itp.) to w PowerShellu istnieje komenda "import-csv", która pozwala obracać danymi według własnych potrzeb :)
  • Poziom 7  
    Zaproponowane rozwiązanie działa, temat do zamknięcia.