【问题标题】:Calling a function for every attribute I want to read from multiple .txt files and write to .csv file为我想从多个 .txt 文件读取并写入 .csv 文件的每个属性调用一个函数
【发布时间】:2022-11-24 03:59:16
【问题描述】:

我试图为我想从 4 个 .txt 文件中读取的每个属性(列)调用一个函数,然后写入一个 .csv 文件。一列的输出有缺陷,代码应该有一些逻辑缺陷,因为我还没有从头开始学习批处理。你知道解决办法吗?

链接到以前解决的问题:Read information from multiple .txt files and sort it into .csv file

@Magoo

echo Name;Prename;Sign;Roomnumber;Phonenumber > sorted.csv

for /f  "tokens=1,2 delims= "  %%a in (TestEmployees.txt) do (
call :findSign %%a %%b
)

:findSign
set prename=%1
set name=%2

for /f  "tokens=1,2 delims= " %%a in (TestSign.txt) do (
    if "%name%"=="%%a" (
      call :findRoomNumber
    )
)
    :End
    :findRoomNumber
    set sign=%1
    
        for /f "tokens=1,2 delims=|" %%q in (TestRoomNumber.txt) do (
            if "%sign%"=="%%q"    (
            
            call :findPhoneNumber
            )
        )
               :End
    :findPhoneNumber
    
                for /f "tokens=1,2 delims=;" %%u in (TestPhoneNumber.txt) do (
                    if "%%b"=="%%u"    (
                   
                        echo %name%;%prename%;%%b;%%r;%%v >> sorted.csv
                    )
                )
                    :End

【问题讨论】:

  • 我想为您的问题写一个更好的解决方案,但是,我想要不是输入数据文件来测试我的解决方案...

标签: batch-file


【解决方案1】:

这是我会这样做的方式:

@echo off
setlocal EnableDelayedExpansion

rem Load PhoneNumber array
for /F "tokens=1,2 delims=;" %%a in (PhoneNumber.txt) do set "phone[%%a]=%%b"

rem Load RoomNumber array
for /F "tokens=1,2 delims=|" %%a in (RoomNumber.txt) do set "room[%%a]=%%b"

rem Load Sign array
for /F "tokens=1,2" %%a in (Sign.txt) do set "sign[%%a]=%%b"

rem Process Employees file and generate output
> sorted.csv (
   echo Name;Prename;Sign;RoomNumber;PhoneNumber
   for /F "tokens=1,2" %%a in (Employees.txt) do for %%s in (!sign[%%b]!) do (
      echo %%b;%%a;%%s;!room[%%s]!;!phone[%%s]!
   )
)

【讨论】:

    【解决方案2】:
    @ECHO OFF
    SETLOCAL
    rem The following settings for the directories and filenames are names
    rem that I use for testing and deliberately includes 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 "destdir=u:your results"
    SET "filename1=%sourcedir%q74258020_TestEmployees.txt"
    SET "filename2=%sourcedir%q74258020_TestSign.txt"
    SET "filename3=%sourcedir%q74258020_TestRoomNumber.txt"
    SET "filename4=%sourcedir%q74258020_TestPhoneNumber.txt"
    SET "outfile=%destdir%outfile.txt"
    
    >"%outfile%" (
     echo Surname;Name;Sign;Roomnumber;Phonenumber
    
     for /f "usebackqtokens=1,2 delims= "  %%g in ("%filename1%") do (  
      call :findSign %%g %%h
     )
    )
    
    GOTO :eof
    
    :findSign
    for /f  "usebackqtokens=1,2 delims= " %%b in ("%filename2%") do (
      if "%2"=="%%b" (
        for /f  "usebackqtokens=1,2 delims=|" %%q in ("%filename3%") do (
         if "%%c"=="%%q" (
            for /f  "usebackqtokens=1,2 delims=;" %%u in ("%filename4%") do (
              if "%%c"=="%%u" (
                echo %2;%1;%%c;%%r;%%v
              )
        )
          )
        )
      )
    )
    
    GOTO :EOF
    

    在应用于真实数据之前,请始终对照测试目录进行验证。

    请注意,如果文件名不包含空格等分隔符,则可以省略usebackq%filename1% 周围的引号。

    Why should I not upload images of code/data/errors? 将代码复制并粘贴为文本

    出于类似的原因,请将所有相关数据发布到一个问题中,以避免每个潜在的受访者不得不来回切换到您所链接的数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-23
      • 2021-02-06
      • 2022-01-03
      • 1970-01-01
      • 2023-01-10
      • 1970-01-01
      • 2020-03-16
      • 2020-04-26
      相关资源
      最近更新 更多