我有一個需要使用批處理腳本來完成的家庭作業。.txt如果檔案中有分隔符號.,或者,這些字串可能同時包含單詞和數字,我需要重寫檔案中的所有數字。結果也應該保留在同一個檔案中。
例如:
Lorem ipsum dolor 12.3254
2556,4646 ex commodo
會成為
Lorem ipsum dolor 123254
25564646 ex commodo
我從一些看起來像這樣的代碼開始:
@echo off
setlocal EnableDelayedExpansion
SET verfile=%1
FOR /f "tokens=* delims= " %%A IN (%verfile%) DO (
SET "Var=%%A"
FOR /l %%i IN (0, 1, 9) DO (
echo !Var! | findstr "."
IF %ERRORLEVEL% EQU 0 (
)
)
現在我不知道如何繼續它。
你能幫我嗎?
uj5u.com熱心網友回復:
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
rem The following settings for the source directory and filename are names
rem that I use for testing and deliberately include names which include spaces to make sure
rem that the process works using such names. These will need to be changed to suit your situation.
SET "sourcedir=u:\your files"
SET "filename1=%sourcedir%\q73553463.txt"
:: remove variables starting #
FOR /F "delims==" %%b In ('set # 2^>Nul') DO SET "%%b="
SET /a linecount=0
:: Read entire file into memory
FOR /f "usebackqdelims=" %%e IN ("%filename1%") DO (
rem next line number
SET /a linecount =1
rem record in memory
SET "#!linecount!=%%e"
)
:: process each line removing [,.] following a digit
:: and report to original file
(
FOR /L %%e IN (1,1,%linecount%) DO (
FOR %%c IN ("." ",") DO FOR /L %%y IN (0,1,9) DO SET "#%%e=!#%%e:%%y%%~c=%%y!"
ECHO !#%%e!
)
)>"%filename1%"
TYPE "%filename1%"
GOTO :EOF
該set #命令將生成一個串列,如
#whatever=something
#whateverelse=somethingelse
對于當前設定和啟動的所有變數#。但是有任何變數集開始是不尋常的,#因此set會產生錯誤。將2^>nul任何錯誤報告(在標準設備stderr上,即 device上2)發送到nul無處。插入符號^是必需的,因為cmd需要區分set命令的一部分和for.
for/f...%%b的使用delims從. 標記由和之間指定的任何分隔符的任何序列分隔,默認情況下,“token1”被選中,因此應用于的字串是=set="%%b
#whatever
#whateverelse
并且這些變數需要設定為空。
for /?從提示中查看有關 SO 的檔案或for瀏覽數千個示例。
用于set "var=value"設定字串值 - 這可以避免尾隨空格引起的問題,這可能會導致混亂。一朝被蛇咬十年怕井繩。
然后我們讀取檔案。使用"delims="不設定分隔符,因此整行形成“token 1”,分配給%%e. 更改了的usebackq含義,"以便可以使用雙引號檔案名。我使用的檔案名包括 aSpace但如果名稱中沒有分隔符,則引號 和usebackq可以省略(同樣, ref for/?)
然后將行數加 1,并通過將行分配給 來記錄記憶體中的行#!linecount!。!linecount!是必需的,因為linecount在block(帶括號的行序列)內變化 - 并且delayedexpansion啟用時,%linecount%產生遇到塊時的值,以及!linecount!運行時或瞬時值 - 因為它在塊內發生變化。
Stephan 的 DELAYEDEXPANSION 鏈接
所以 - 建立#1, #2..#%linecount%與檔案中的行,我們可以處理這些變數并生成一個替換檔案。
請注意,有一個由 組成的塊 ( for...%%e...)>filename。這允許echo將塊內的任何 ed 資料重定向到檔案。>重定向到新版本,而>>將附加到任何現有檔案。
#linenumber所以 - 我們使用for /Lon遍歷所有行%%e。對于其中的每一個,我們設定%%cto"."和%%yto 0to9然后將任何字串%%y%%c替換為%%y(例如替換為) 3.。3然后重復%%c設定為","。set /?提供檔案和瀏覽 SO 示例。
但是哇,內迪!這里有一個小技巧。,是一個串列分隔符,所以(. ,)不起作用 - 它將被視為(.). 使用引號允許cmd單獨讀取每個字符,我們需要使用%%~c而不是%%c轉儲引號。
所以 - 環顧四周。如果你足夠狡猾,你可以用批處理做很多事情。如果你提出這個解決方案,毫無疑問你會受到挑戰。準備好解釋它。跟蹤正在發生的事情的一個非常好的方法是打開echo并逐步觀看魔術。在您觀察正在發生的事情時,隨意使用pause并可能洗掉以防止報告進入檔案。>"%filename1%"
uj5u.com熱心網友回復:
@echo off
setlocal enabledelayedexpansion
set "verfile=%~1"
echo before:
type "%verfile%"
for /f "usebackq tokens=*" %%a in ("%verfile%") do (
set strline=%%a
set strline=!strline:.=!
set strline=!strline:,=!
echo !strline!>>"%verfile%.tmp"
)
echo.
echo after:
type "%verfile%.tmp"
del /f /q "%verfile%.tmp"
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/507907.html
標籤:批处理文件
