Łączenie wielu plików tekstowych w jeden plik

Dziś w pracy dostałem 20 plików SQL tworzących poszczególne tabele w bazie danych. Niestety, ze względu na monitorek 17 calowy, załadowanie ich do SQL Management Studio a następnie odpalanie ich tak długo aż wszystkie się zakończą (ze względu na zależności pomiędzy konkretnymi tabelami) jakoś mi się osobiście nie widziało :)

Dlatego stwierdziłem, że zrobię sobie dobrze i wykorzystam DOS do tego by połączyć pliki:

copy file1.txt + file2.txt + file3.txt out.txt

Niestety, nie podobało mi się to zbytnio gdyż trzeba było podać nazwy plików :( Więc zamieniłem polecenie na:

copy *.txt out.txt

I z zadowoleniem otworzyłem pliczek out.txt. Od razu mi mina zrzedła, zamiast ładnie połączonych plików dostałem wszystkie pliki w jednej linijce – było to spowodowane tym, iż w plikach tekstowych samplowych nie posiadałem znaku enter. Wynik był taki:

plik1plik2plik3->

To co mi się jeszcze nie podobało to ta ładna strzałka na końcu pliku (tutaj jest ona przeze mnie wprowadzona gdyż jest to znak specjalny, widoczny w Notepad, ale już w Management Studio i na blogu nie :D). Więc zacząłem kombinować inaczej:

for %f in (*.txt) do type "%f" >> out.txt

Po raz kolejny wynik nie był zadowalający:

plik1plik2plik3plik1plik2plik3

To co mnie teraz denerwowało to, to iż wciąż wszystko było w jednej linijce, zaś dodatkowo zostało wszystko powtórzone. Stało się tak ze względu na to, że prosty skrypt załapał także pliczek out.txt :) i go sobie z duplikował ;)

Myślałem, że już będę pisał skrypt VBScript lub jakąś prostą aplikację C#, jednak stwierdziłem, że sprawdzę jeszcze jak to jest z tym PowerShell. Na początku prosta próba (cat, jest aliasem na polecenie Get-Content):

cat file1.txt,file2.txt > out.txt

Obejrzałem plik out.txt i uśmiech od razu mi się pojawił na twarzy :)

Plik1

Plik2

 

No dobrze, to teraz trzeba było jeszcze to zeskryptować tak by pobierał wszystkie pliki, pierwsza próba:

cat *.txt > out.txt

Zakończyła się… nieskończoną pętlą (zorientowałem się po 2 minutach… ech).

Po przejrzeniu dokumentacji, wykonałem takie o to polecenie:

cat *.txt -Exclude out.txt > out.txt

uff to już zadziałało tak jak chciałem :) i nieskończonej pętli już nie było :)

Mam nadzieję, że się to komuś przyda :) mnie się przydało ;)

PS.: Innym poleceniem PowerShell które można wykorzystać jest:

Add-Content -Path .\out.txt -Value (Get-Content *.txt)

Tym razem nie musimy się męczyć z Exclude.

Opublikowane 08 kwietnia 09 12:15 przez Gutek
Filed under: ,

Powiadamianie o komentarzach

Jeżeli chciałbyś otrzymywać email gdy ta wypowiedź zostanie zaktualizowana, to zarejestruj się tutaj

Subskrybuj komentarze za pomocą RSS

Komentarze:

# GT said on kwietnia 8, 2009 08:33:

Co do znaków specjalnych w pliku, to wystarczy w poleceniu copy podać parametr /B.

Działa odkąd pamiętam, to znaczy co najmniej od DOSa 3.30 ;)

# matma said on kwietnia 8, 2009 10:01:

Odpowiednikiem unixowego cat w cmd jest polecenie type (http://en.wikipedia.org/wiki/List_of_DOS_commands#type), więc ta komenda wyglądałaby jakoś tak:

type 1.txt 2.txt 3.txt > out.txt

Można się jeszcze pobawić z przekierowaniem output'a na null albo @echo off i plik bat, żeby nie wypluwał zawartości na ekran :)

# Gutek said on kwietnia 8, 2009 11:28:

@GT

o dzieki nie wiedzialem :)

@matma

for %f in (*.txt) do type "%f" >> out.txt

to jest przyklad gdzie jest wykorzystywany type - niestety, wciaz dziala on na laczeniu zawartosci w miejscu gdzie ostatni plik sie skonczyl - czyli w moim przypadku linia ciagla.

a o tym @echo off to juz kompletnie zapomnialem, dzieki za przypomnienie :)

Gutek

Co o tym myślisz?

(wymagane) 
(opcjonalne)
(wymagane) 

  
Wprowadź kod: (wymagane)