【问题标题】:Output folder name and files of specific format in folder using Batch to csv [closed]使用Batch到csv输出文件夹名称和文件夹中特定格式的文件[关闭]
【发布时间】:2015-07-18 20:44:52
【问题描述】:

我有几个文件夹,它们包含扩展名为 .mdb 和 .mpg(以及更多)的文件。我需要一个输出文件夹名称(第 1 列)、.mdb 文件名(第 2 列)和 .mpg 文件名(第 3 列)的 csv 文件。 .mpg 是多个数

所以输出会是这样的:

输出.csv

    A        B       C
    folder1 abc     xyz
                    hgf
                    pqr

    folder2 lala    didi
                    loc

A、B 和 C 是列。此外,如果可能的话,换行符会很棒。使用 Windows 7。

我在做

    for /f "tokens=*" %%g in ('dir /b /a:d "*"') do (
    forfiles /m *.mdb /c "cmd /c echo @fname>>output.csv"
    )

【问题讨论】:

  • 如果您不是自己编程,那么应该在 superuser.com 上询问“请帮我做”问题。
  • 我一直认为 SuperUser 更像是“我将如何......?”地点。如果他想为他完成,我会在一个专门研究批处理的实际编程论坛上询问,比如 SS64。
  • 我不希望它为我完成。我已经尝试了四天,试图理解批处理编程并在其中循环。这是我尝试过的for /d %%D in (cd fol*) do( for /f %%F in (*.mdb) do echo %%~nF)>>output.csv,但它在当前目录中查找 .mdb 文件,而不在目录内遍历。找不到解决此问题的方法,因此在此处发布了问题。

标签: windows csv batch-file batch-processing


【解决方案1】:

假设每个文件夹只有一个.mdb,并且您不想处理不存在.mdb 的文件夹:

echo off
setlocal enabledelayedexpansion
(
for /r %%d in (*.mdb) do (
  set first=yes
  set d=%%~pd
  for %%z in ("!d:\=.!") do set d=%%~xz
  <nul set /p =!d:.=!,%%~nd,
  for %%f in ("%%~pd\*.mpg") do (
    if defined first (
      echo %%~nf
      set "first="bre
    ) else (
      echo ,,%%~nf
    )
  )
  echo(
)
)>output.csv

带有解释的相同代码(在每一行下):

@echo off
setlocal enabledelayedexpansion
(
REM enclose the whole code in parantheses ...<1>
for /r %%d in (*.mdb) do (
REM for every found .mdb file in folder or subfolders
REM /r = recursiv (including subfolders)
  set first=yes
  REM just a flag to identify the first line 
  set d=%%~pd
  REM get path of the file
  for %%z in ("!d:\=.!") do set d=%%~xz
  REM ugly code for getting the last element of the path
  REM by replacing \ with . so it looks like a filename
  REM %%~xz gets the "extension" of that fake-"file"
  <nul set /p =!d:.=!,%%~nd,
  REM using set /p trick to write a line without linefeed
  REM write the last path-element (with the dot removed) <comma> name of the mdb-file <comma>
  for %%f in ("%%~pd\*.mpg") do (
  REM for every .mpg in the found folder
    if defined first (
    REM if it is the first line (where the folder and the .mdb has to be written too)
      echo %%~nf
      REM append the name of the .mpg to the already written <folder>,<mdb-name>,
      set "first="bre
      REM delete the first-line-flag
    ) else (
      echo ,,%%~nf
      REM write a complete line
    )
  )
  echo(
  REM write the awesome linefeed
)
REM  <1>... to write it's complete output to a file
)>output.csv

对于setlocal delayedexpansion,请参阅here

【讨论】:

  • 在 column1 中,它给出的输出类似于 \abc\sample - 14.07.2015\fname\ 而不仅仅是 fname。第 2 列是正确的。第 3 列的样本和 - 在不同的行中。 (示例 - 14.07.2015 的名称中有空格,如果重要,不确定)。它应该是 .mpg 文件,而不是当前目录名。
  • 是的,这行得通。非常感谢。但是,有两件事 1) 你可以解释一下吗?我只是想了解批处理编程。如果您现在无法管理,那也没关系。 2) 它在每个不需要的子文件夹中创建 output.csv。
  • 1) 我明天会解释。 2)在每个文件夹中?它只创建一个 csv。你可以给它一个路径:&gt;"c:\my path\output.csv"
  • 是的,删除所有文件夹中的 output.csv 解决了这个问题。我认为这可能是由最后一个脚本创建的。没有把握。非常感谢您的回答。 :)
  • 添加代码说明
猜你喜欢
  • 2020-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-11
  • 1970-01-01
相关资源
最近更新 更多