【问题标题】:How to Batch Append Filename to TXT Contents, Name Output File Based on Original Input Filename, and Loop Through 200,000 Input Files如何批量追加文件名到TXT内容,根据原始输入文件名命名输出文件,循环遍历200,000个输入文件
【发布时间】:2017-06-09 18:24:41
【问题描述】:

我正在从事一个 HR 数据项目,经过大量研究和更多尝试和错误,我已经调整了以下批处理文件(Windows 8.1 环境),它成功地从一个杂乱的文本文件中提取了员工的开始日期 - 非常感谢向用户 dbenham 提供先前的解决方案(我再次对其进行了如下调整):

@echo off
setlocal disableDelayedExpansion
set "cnt=1"
>OUTPUT.txt (
  for /f "skip=219 tokens=24,25,26 delims= " %%B in (MVANHOUTEN.txt) do (
    echo(%%B %%C %%D
    set /a "1/(cnt-=1)" 2>nul || goto :break
  )
)
:break

在哪里 MVANHOUTEN.txt 是输入文件

OUTPUT.txt 文件仅包含: 1991 年 1 月 21 日

我对批处理文件编程的复杂性了解有限,尽管我已经确认 dbenham 的代码的天才之处与我的上述更改 100% 有效,但我不知道如何在不破坏它的情况下进行更改。我需要这个批处理文件再做三件事,但如果不破坏上述代码的功能,我似乎无法让它工作。具体来说,我需要:

  1. 我需要在数据提取后将原始文本文件名添加到输出文件的内容中。也就是说,我需要我的输出文件包含: MVANHOUTEN 1991 年 1 月 21 日
  2. 我需要将输出文件命名为与输入文件相同的文件名,而不是 OUTPUT.txt,即 MVANHOUTEN.txt。如果这不可能或太笨拙,添加到原始文件名将是一个不错的选择——例如MVANHOUTEN-Processed.txt)
  3. 我需要一个 do 循环,因为我有一个包含近 200,000 名现任和前任员工的目录,并且我需要为每个文件批量执行上述操作 - 所以在逻辑上代替了上面的“(MVANHOUTEN.TXT)” ,我需要找到一种方法来循环遍历同一目录中的许多 *.txt 文件。结果将是单独的文件 MVANHOUTEN.txt、CMONTYBURNS.txt、DISCOSTU.txt 等(或 MVANHOUTEN-Processed.txt、CMONTYBURNS-Processed.txt、DISCOSTU-Processed.txt 等)。

任何人都可以帮我增强上面的批处理文件以完成上述操作,而不会破坏我从 dbenham 成功改编的原始清理吗?非常感谢!

【问题讨论】:

  • set /a 语句的用途是什么?
  • 您将需要嵌套的 FOR 命令。外部是标准 FOR 命令,用于迭代所有文件名,内部 FOR 命令将是您当前的 FOR /F。
  • 如果从文件中检索所需信息的唯一方法是跳过前 219 行然后拆分出 24-26 标记,我会觉得很奇怪或很不幸。正如您可以想象的那样,在不知道输入文件的布局和结构的情况下提供适当的替代方案对我们来说将是一个困难的提议。因此,我们需要查看整个文件并确保所有其他文件都足够相似,可以将其用作基础。
  • @compo-为什么会很奇怪?感谢您的好奇心,但它与所提出的实际问题没有任何关系。提供的代码 100% 有效。问题不在于它为什么起作用,甚至不在于必须解析数据的“不幸方式”(该部分已解决,并且 HR 数据是专有的)。这个问题是如何 1)将文件名附加到每个结果,2)适当地命名结果,以及 3)在 for 循环中处理多个实例。

标签: windows batch-file for-loop text editing


【解决方案1】:

未经测试,因为我没有你的数据文件:

@echo off
setlocal disableDelayedExpansion

for /f "delims=" %%a in ('dir /b *.txt') do (
  call :process %%a
)

:process
set "cnt=1"
>"%~n1-Processed.txt" (
  for /f "skip=219 tokens=24,25,26 delims= " %%B in (%~nx1) do (
    echo( %~n1 %%B %%C %%D
    set /a "1/(cnt-=1)" 2>nul || goto :eof
  )
)

【讨论】:

  • 出色且准确,斯蒂芬!这很好用,正是我寻求的解决方案(我只需要在 %~n1-Processed.txt 之前删除前导“)。我非常感谢你的回答,并会这样标记。这样我就可以学习,怎么可能如果我想覆盖原始文件名(而不是附加 -Processed),我会更改此代码?再次感谢先生!
  • 覆盖不起作用,因为您仍想从同一个文件中读取数据(文件将在您读取数据之前被覆盖)。阅读完成后使用重命名:move /y "%~n1-Processed.txt" "%~nx1"。把它放在goto :eof 之前:`... || (移动 /y "%~n1-Processed.txt" "%~nx1" & goto :eof)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-29
  • 2013-08-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多