วิธีอ่านสตริงจากไฟล์ข้อความและใช้ในไฟล์แบตช์ของ Windows เพื่อแยกสตริงย่อย

Aug 20 2020

เรามีไฟล์ข้อความที่เราต้องการซึ่งมีตัวอย่างต่อไปนี้ สตริงคงที่ "D80" หนึ่งสตริงตามด้วยสตริงอื่น:

D80KAAAAAA
D80KBBBBBB
D80KCCCCCC

เราต้องการแตกไฟล์โดยใช้ไฟล์ batch script ของ Windows (ไม่ใช่ powershell) และ FOR loop เพื่อให้ได้ผลลัพธ์นี้:

AAAAAA
BBBBBB
CCCCCC

เรามาถึงจุดนี้แล้ว สำหรับภาพประกอบฉันได้แสดงความพยายามที่แตกต่างกันในการแยกสตริงย่อย:

setlocal EnableDelayedExpansion

for /F "tokens=1 delims="    %%a   in (TPLIST.txt) do (
    echo %%a
    echo %%(a:~4,6)
    set substr1=%%(a:~4,6)%
    set substr2=%(a:~4,6)%
    set substr3=!(a:~4,6)!
    set substr4=%!(a:~4,6)!%
    echo %substr1%
    echo %substr2%
    echo %substr3%
    echo %substr4%
)

อย่างไรก็ตามการแยกสตริงย่อยล้มเหลว:

C:\User>setlocal EnableDelayedExpansion
C:\User>for /F "tokens=1 delims=" %a in (TPLIST.txt) do (
echo %a
 echo %(a:~4,6
)
C:\User>(
echo D80KAAAAAA
 echo %(a:~4,6
)
D80KAAAAAA
%(a:~4,6
C:\User>(
echo D80KBBBBBB
 echo %(a:~4,6
)
D80KBBBBBB
%(a:~4,6
C:\User>(
echo D80KCCCCCC
 echo %(a:~4,6
)
D80KCCCCCC
%(a:~4,6
C:\User>set substr1=%(a:~4,6)
C:\User>set substr2=~4,6)
C:\User>set substr3=!(a:~4,6)!
C:\User>set substr4=~4,6)!
C:\User>echo %(a:~4,6)
%(a:~4,6)
C:\User>echo ~4,6)
~4,6)
C:\User>echo ~4,6)
~4,6)
C:\User>echo ~4,6)
~4,6)

ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชมอย่างมาก.

คำตอบ

1 DavidPostill Aug 20 2020 at 04:36

ฉันจะแยกสตริงย่อยได้อย่างไร

สคริปต์ของคุณเสียอย่างมากดังนั้นฉันจึงเขียนใหม่:

@echo off
setlocal enabledelayedexpansion
for /f "tokens=1,2,3" %%a in (test.txt) do (
  set _s1=%%a
  set _s2=%%b
  set _s3=%%c
  echo !_s1:~4!
  echo !_s2:~4!
  echo !_s3:~4!
  )
endlocal

ตัวอย่างการใช้งาน:

F:\test>type test.txt
D80KAAAAAA D80KBBBBBB D80KCCCCCC

F:\test>test
AAAAAA
BBBBBB
CCCCCC
F:\test>

อ่านเพิ่มเติม

  • ดัชนี AZ ของบรรทัดคำสั่ง Windows CMD | SS64.com
  • คำสั่ง Windows CMD (จัดประเภท) - Windows CMD - SS64.com
  • สำหรับ / f - วนซ้ำข้อความ - Windows CMD - SS64.com
  • สตริงย่อยตัวแปร - Windows CMD - SS64.com
1 Hackoo Aug 26 2020 at 05:44

ในไฟล์ Pure batch คุณสามารถทำสิ่งนั้นได้:

@echo off
Set "InputFile=TPLIST.txt"
Set "OutPutFile=%~dp0Out-Extract.txt"

setlocal enabledelayedexpansion
> "%OutPutFile%" (
    @for /f "delims=" %%a in ('Type "%InputFile%"') do (
    set "_MyString=%%a"
    echo !_MyString:~4!
    )
)
endlocal
If Exist "%OutPutFile%" Start "" "%OutPutFile%"

ใน Powershell หากสมาชิกรายอื่นต้องการทดสอบโดยใช้ RegEx:

cls
$MyString = @' D80KAAAAAA D80KBBBBBB D80KCCCCCC D80KDDDDDD D80KEEEEEE D80KFFFFFF D80KXXXXXX D80KYYYYYY D80KZZZZZZ '@ -split [System.Environment]::NewLine $pattern = '(?![D80K]).+'
$MyString | %{ [regex]::matches($_,$pattern) } | %{ $_.Groups[0].Value }

คุณจะได้รับเป็นผลลัพธ์สำหรับโซลูชันทั้งสองชุดหรือ powershell เช่นนั้น:

AAAAAA
BBBBBB
CCCCCC
DDDDDD
EEEEEE
FFFFFF
XXXXXX
YYYYYY
ZZZZZZ