Wykorzystanie pliku txt jako źródła zmiennych dla batch-a XP

CZołem,

Właściwie nie wiem czy tu powinienem to pisać…

Mam taką zagwozdkę. Tworzę batch-a do zarządzania danymi pogrupowanymi w katalogach stanowiących jedną cząstką danych. Muszę wykonać polecenie programem zewnętrznym (jeden z programików programu FUSION), na każdym z osobna pliku w katalogu. Polecenie normalnie (wpisywane w cmd) wygląda tak:

LDA2ASCI nazwa_pliku.lda nazwa_pliku.asc

Problem w tym że programik LDA2ASCII nie pozwala na użycie znaków * i ? zastępujących ciągi i litery. Pomyślałem, że mógłbym wykorzystać listę plików do przetworzenia umieszczoną w zewnętrznym pliku txt jako listę zmiennych kolejno wczytywanych do polecenia w pętli. Ale nie wiem czy CMD pozwala na taką operację, czyli na wczytanie wiersza pliku txt o konkretnym numerze do wykonywanego polecenia.

Czy jest to możliwe? Czy w ogóle dobrze rozumuję?

Proszę o pomoc w gardłowej sprawie.

pozdrawiam

SS

Coś takiego kiedyś robiłem (jakieś 14 lat temu w DOSie 3.30, czy 5.00), ale zabij mnie - nie pamiętam składni. Jednak jeśli masz ten plik, żaden problem wciągnąć go do Excela (czy innego produktu mniej czy bardziej darmowego) i w kolejnej kolumnie zrobić konkatenację (połączenie) komendy LDA2ASCI z resztą linii. Po tym eksportujesz zawartość kolumny wynikowej do pliku .BAT i masz gotowego “bacza”. Domyślam się, że co bardziej wyuzdane edytory tekstowe udostępniają mechanizm pozwalający na operowanie tekstem blokowo w tym wklejanie dowolnego tekstu, ale osobiście posłużyłbym się Excelem.

CZ,

Dzięki za odpowiedź, ale tak właśnie sobie teraz radzę, jak coś muszę przeliczyć. Jednak cały zbiór stanowi 353 katalogi, więc szukam rozwiązania systemicznego i na przyszłość. Korzystam z UltraEdita-32. Wiem, że mogę wczytać wszystkie listy plików z 353 katalogów do UltraEdita, wcześniej sporządzić makro robiące dla mnie batch-e dla każdego katalogu a te odpalić jednym batch-em. Jednak nieco mnie to przeraża i jakbym mógł nie uciekać się do edytorów tekstowych to by było miodzio :slight_smile:

SS

Ja bym zrobił to jeszcze inaczej: Napisałbym program, który pobierałby z pliku ciąg zawierający nazwę pliku do skonwertowania wraz ze ścieżką do katalogu w którym ten plik się znajduje, a następnie wywoływał program podając stosowne nazwy plików jako parametr. Oczywiście takie rozwiązanie aż prosi się o zgrabną otoczkę w postaci obsługi błędów, parametryzacji i tym podobnych. Ale takie coś służyłoby Ci dość dobrze i długo.

A tak w ogóle, to jak wygląda zawartość tego pliku z katalogami? To wynik komendy DIR przekierowanej na plik? Możesz wkleić kawałek takiego pliku wejściowego?

CZ,

Struktura katalogu roboczego jest następująca:

KALFE

  |-(...)

  |-17_24

  |-17_25

  |-(...)

Przykładowy katalog zawiera następujące pliki:

last_HF0021_3_5.LDA

last_HF0021_3_5.ldi

last_HF0021_3_5.ldx

last_HL0021_3_5.LDA

last_HL0021_3_5.ldi

last_HL0021_3_5.ldx

lista_lda.txt

Pliki .ldi i .ldx to pliki indeksów dla LDA. lista_lda.txt to lista plików LDA w katalogu. Podany przeze mnie przykładowy katalog jest oczywiście malutki, w największych jest do 20 LDA. A tak w ogóle to są to dane ze lotniczego skaningu laserowego, LDA to format binarny czytany tylko przez jeden program i muszę m.in. wyeksportować do formatu czytanego przez inny program.

SS

W dniu 06.05.2008 , o godzinie 15:02 został dopisany post przez tatanka88

CZ,

Piszesz jeszcze:

no właśnie nie wiem jak pobrać tę nazwę pliku z pliku :frowning:

SS

Czyli reasumując, masz ileś katalogów, każdy z nich zawiera oprócz plików .LDA, .LDI i .LDX równiez plik LISTA_LDA.TXT, który w sobie zawiera listę plików LDA z danego katalogu. I to posiłkując się tym właśnie plikiem, chcesz dla każdego pliku, którego nazwa zawarta jest w pliku TXT, wykonać konwersję z LDA do ASCII. Dobrze rozumiem? Jeśli tak, to podpowiem Ci, że dla potrzeb realizacji takiego zadania, lepiej by było, gdybyś miał w katalogu nadrzędnym do tych które zawierają pliki .LD? (jak mniemam tutaj nazywa się on KALFE), plik zawierający nazwy i ścieżki do plików, które chcesz skonwertować. Oczywiście dotyczy to sytuacji, kiedy chcesz robić konwersję wszystkich plików .LDA, a nie tylko tych znajdujących się w wybranym katalogu. Aby uzyskać taką listę, wystarczy, że z linii komend będąc w katalogu KALFE wywołasz komendę

dir *.LDA /b /s >LDA2CNV.TXT

Co do pobrania nazwy pliku z pliku zawierającego ścieżki i nazwy wszystkich plików LDA, to metoda zależy od zastosowanego języka w którym napiszesz program który ma wywoływać konwerter. Przykładowo w VBA wyglądałoby to w rodzaju (piszę z głowy):

Open "ListaPlikowLDA.txt" for input As #1

do until not EOF(1)

   line input #1, NazwaPlikuLDA

  {przetwarzanie jakoś tego pliku}

loop

Ale to jest “rzeźba w g…”, a ja nadal mam silne przeświadczenie, że już na etapie generowania listy plików za pomocą komendy DIR, można spowodować, że plik wynikowy będzie zawierał w każdej linii kompletną komendę do wykonania uzupełnioną o nazwę i ścieżkę do pliku który ma być skonwertowany. Tylko nie mogę się dokopać do tej informacji.W dniu 07.05.2008 , o godzinie 9:41 _został dopisany post przez Doberman_Słuchaj, na szybko zrobiłem tak, jak sugerowałem Ci na początku; 1. Stworzyłem plik zawierający listę plików do przetworzenia wraz ze ścieżkami w których te pliki rezydują (komenda DIR plus te wszystkie pizdrygałki - parametry). 2. Wrzuciłem zawartość pliku wynikowego do Excela do kolumny A 3. W komórce B1 wpisałem formułę

="copy """&A1&""" """&LEFT(A1;FIND(".";A1;1)-1)&".XYZ"""

co jako wynik dało mi komendę kopiowania pliku z nazwą podaną w komórce A1 do tego samego katalogu w którym leży orginalny plik, ale z nazwą pliku nie rozszerzoną o orginalne rozszerzenie, lecz o ciąg “XYZ”

  1. Skopiowałem formułę z B1 do wszystkich pozostałych linii.

  2. Skopiowałem zawartość kolumny B do pliku z rozszerzeniem BAT i dostałem ślicznego bacza robiącego kopię 673 plików TXT do plików XYZ o tej samej nazwie.

Oczywiście musisz pamiętać o ograniczeniu ilości linii w Excelu do 65536, ale jeśli masz więcej plików do przetworzenia, to pozostaje plik źródłowy zawierający listę plików LDA podzielić na kilka, co za pomoca UltraEdita łatwo zrealizować.