【问题标题】:Merge data with partially matched filename合并文件名部分匹配的数据
【发布时间】:2013-03-16 03:20:19
【问题描述】:

我有很多文件名部分匹配的数据文件,例如

T70M1U1-cell.txt
T70M1U1-anode.txt
T80M5U1-cell.txt
T80M5U1-anode.txt
...

“T70M1U1-cell.txt”包含

A
B
C

和 “T70M1U1-anode.txt”包含

1
2
3

我想将两个数据集合并为一个“T70M1U1.txt”,其中包含:

A    1
B    2
C    3 

如何使用批处理或软件批量合并两个数据集“T70M1U1-cell.txt & T70M1U1-anode.txt”和其他类似的数据集?

【问题讨论】:

  • T70M1U1 部分的长度是否始终为 7 个字符,还是会有所不同?
  • 是的,总是 7 个字符

标签: batch-file merge match


【解决方案1】:
@ECHO OFF
SETLOCAL
SET source=c:\sourcedir
SET dest=c:\destdir
FOR /f "delims=-" %%a IN (
 'dir /b/a-d "%source%\*-cell.txt"'
 ) DO IF EXIST "%source%\%%a-anode.txt"  (
 FOR /f "tokens=1*delims=:" %%p IN ('findstr /n /r "$" ^<"%source%\%%a-cell.txt"') DO (
   FOR /f "tokens=1*delims=:" %%s IN ('findstr /n /r "$" ^<"%source%\%%a-anode.txt"') DO (
   IF %%p==%%s >>"%dest%\%%a.txt" ECHO %%q %%t
   )
  )
 )

您似乎只需要修改源目录和目标目录以适合您的情况。

【讨论】:

  • 感谢您的回答。但是,我修改了目录后就不行了,你能不能检查一下,因为我对批处理不熟悉。
  • 我会拿出水晶球...迷雾正在消散...灵魂说最好确切地说出您选择的目录或邪恶的黑色屏幕响应,甚至您所说的“效果不佳”。他们最好的猜测是调用引用的咒语 - 尝试 set source="yoursourcedir"source 和它的孪生,dest,因为背信弃义的编辑器在批处理行中添加尾随空格是不为人知的,从而使路径难以理解对于cmd.exe 精灵...
  • 抱歉我的描述不清楚。我尝试在sourcedest set source="d:\source" 中添加引号,并且黑屏没有显示任何内容,并且“d:\dest”中也没有txt 文件。当我在第 8 行 FOR /f "tokens=1*delims=:" %%p IN ('findstr /n /r "$" ^&lt;"%source%\%%a-cell.txt"') DO ( echo %%p 中添加 echo %%p 时,屏幕什么也没有显示。
  • 尝试更改第 7 行 ` ) DO IF EXIST "%source%\%%a-a-anode.txt" (` to ` ) DO echo %%a&amp;IF EXIST "%source%\%%a-anode.txt" ( echo %%a-anode exists 应该显示检测到哪些 *-cell 文件以及是否不存在相应的-anode。我建议delims 子句中的- 可能丢失,使%%a 成为完整文件名。或者a-d 中的- 丢失,这将导致dir 尝试列出(不存在的)目录而不是不区分目录。
  • 更改第7行,屏幕显示T70M1U1 T70M1U1-anode exists。 'dest'中也没有文件。看来问题出在第 8 行。
【解决方案2】:
@echo off
setlocal enabledelayedexpansion

cd "dir\containing\txtfiles"

for %%I in (*-cell.txt) do (
    set arr.length=0
    set file=%%~nxI
    set dest=!file:-cell.txt=.txt!
    if exist "!dest!" del "!dest!"
    for /f "usebackq" %%a in ("!file:cell.txt=anode.txt!") do (
        set "arr[!arr.length!]=%%a"
        set /a "arr.length+=1"
    )
    set idx=0
    for /f "usebackq" %%a in ("%%I") do (
        >>"!dest!" call :dump %%a !idx!
        set /a "idx+=1"
    )
)
goto :EOF

:dump
echo %1 !arr[%2]!

在最后一行,应该是echo %1!arr[%2]! 之间的制表符,但您可以使用任何您认为合适的分隔符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 2015-08-20
    • 2018-02-03
    相关资源
    最近更新 更多