Jak odczytać plik (tekstowy lub binarny) z pliku wsadowego? Czy jest sposób na odczytanie go w trybie binarnym lub tekstowym?
TYPE [fileName]
dla MS-Dos.
Jak odczytać plik (tekstowy lub binarny) z pliku wsadowego? Czy jest sposób na odczytanie go w trybie binarnym lub tekstowym?
TYPE [fileName]
dla MS-Dos.
Odpowiedzi:
Możesz użyć polecenia for:
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k
Rodzaj
for /?
w wierszu polecenia. Możesz także analizować pliki ini !
for /?
z poleceniem przeanalizowałoby każdą linię w myfile.txt, ignorując wiersze zaczynające się od średnika, przekazując drugi i trzeci token z każdego wiersza do for body, z tokenami oddzielonymi przecinkami i / lub spacjami.
W programie cmd.exe w stylu NT można przeglądać wiersze pliku tekstowego za pomocą
FOR /F %i IN (file.txt) DO @echo %i
Aby uzyskać więcej informacji, wpisz „pomoc dla” w wierszu polecenia. (nie wiem, czy to działa w jakimkolwiek systemie „DOS”, którego używasz)
%%i
.
FOR-LOOP generalnie działa, ale są pewne problemy. FOR nie akceptuje pustych wierszy, a wiersze zawierające więcej niż ~ 8190 są problematyczne. Rozszerzenie działa niezawodnie tylko wtedy, gdy opóźnione rozszerzenie jest wyłączone.
Wykrywanie CR / LF w porównaniu z pojedynczym LF również wydaje się nieco skomplikowane.
Również znaki NUL są problematyczne, ponieważ pętla FOR natychmiast anuluje odczyt.
Dlatego bezpośredni odczyt binarny wydaje się prawie niemożliwy.
Problem z pustymi liniami można rozwiązać sztuczką. Przedrostek każdego wiersza numerem wiersza za pomocą polecenia findstr i po przeczytaniu usuń przedrostek.
@echo off
SETLOCAL DisableDelayedExpansion
FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ t.txt"`) do (
set "var=%%a"
SETLOCAL EnableDelayedExpansion
set "var=!var:*:=!"
echo(!var!
ENDLOCAL
)
Przełączanie między włączaniem a wyłączaniem opóźnionej ekspansji jest konieczne do bezpiecznego działania z ciągami, takimi jak !
lub ^^^xy!z
. Dzieje się tak
, ponieważ linia set "var=%%a"
jest bezpieczna tylko z DisabledDelayedExpansion , w przeciwnym razie wykrzykniki są usuwane, a daszki są używane jako (drugorzędne) znaki zmiany znaczenia i są również usuwane.
Ale używanie zmiennej var
jest bezpieczne tylko w przypadku EnabledDelayedExpansion , ponieważ nawet call %%var%%
nie powiedzie się w przypadku zawartości takiej jak "&"&
.
EDYCJA: Dodano wariant set / p
Istnieje drugi sposób odczytu pliku set /p
, jedynymi wadami jest to, że jest on ograniczony do ~ 1024 znaków na linię i usuwa znaki sterujące na końcu linii.
Ale zaletą jest to, że nie potrzebujesz opóźnionego przełączania i łatwiej jest przechowywać wartości w zmiennych
@echo off
setlocal EnableDelayedExpansion
set "file=%~1"
for /f "delims=" %%n in ('find /c /v "" %file%') do set "len=%%n"
set "len=!len:*: =!"
<%file% (
for /l %%l in (1 1 !len!) do (
set "line="
set /p "line="
echo(!line!
)
)
Aby odczytać to "binarnie" na reprezentację szesnastkową
Możesz spojrzeć na SO: konwersja pliku binarnego na reprezentację HEX przy użyciu pliku wsadowego
set /p
. Użyłem set /p value=< result.txt
pobrać pierwszą linię z pliku tekstowego
0x1A
? nie for /F
zachowują się w ten sam sposób jak przy NUL ( 0x00
) znaków?
:
lub ;
lub zawierają!
Jednym z bardzo łatwych sposobów jest użycie następującego polecenia:
set /p mytextfile=< %pathtotextfile%\textfile.txt
echo %mytextfile%
Spowoduje to wyświetlenie tylko pierwszej linii tekstu w pliku tekstowym. Innym sposobem, w jaki możesz to zrobić, jest użycie następującego polecenia:
type %pathtotextfile%\textfile.txt
Spowoduje to umieszczenie wszystkich danych w pliku tekstowym na ekranie. Mam nadzieję że to pomoże!
Cóż, istnieje wiele różnych sposobów, ale jeśli chcesz tylko WYŚWIETLIĆ tekst, a nie przechowywać go nigdzie, po prostu użyj: findstr /v "randomtextthatnoonewilluse" filename.txt
Poprawiony kod:
setlocal enabledelayedexpansion
for /f "usebackq eol= tokens=* delims= " %%a in (`findstr /n ^^^^ "name with spaces.txt"`) do (
set line=%%a
set "line=!line:*:=!"
echo(!line!
)
endlocal
pause
eol=
i delims=
jest zbędny, set line=%%a
powinien używać cudzysłowów i bez przełączania trybu opóźnionego rozwinięcia, kod nie może odczytać wykrzykników