【问题标题】:Iterating over .csv with .bat file and copy its content to the clipboard使用 .bat 文件迭代 .csv 并将其内容复制到剪贴板
【发布时间】:2021-04-30 08:05:12
【问题描述】:

我想创建一个 .bat 文件来帮助我遍历我的 .csv 文件。我不知道列数或行数。我只知道分隔符是分号。

所以 my.csv 示例:

a;b;c
1qw;ads;f
ads;d;da
ads;asfas;afs

我试过的代码:

SETLOCAL DisableDelayedExpansion
FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ teszt2.csv"`) do (
    set /p="var=%%a"|clip
    SETLOCAL EnableDelayedExpansion
    set "var=!var:*:=!"
    echo(!var!
    ENDLOCAL
)

...但这并不好,因为它只返回最后一行,所以如果我在运行批处理文件后按 CTRL + V,结果将是:var=4:ads;asfas;afs

我想将所有数据保存到我的剪贴板。

有什么解决办法吗?谢谢!

【问题讨论】:

  • 你想在剪贴板里做什么?您是否希望 alqwadsads 将每个值放在单独的一行(CSV 文件中第一个数据列的字段值),还是希望它们在剪贴板的一行中使用 a;lqw;ads;ads ?您的批处理文件示例对我没有任何意义。请打开command prompt,运行clip /? 并阅读输出帮助。然后运行for /? 并从第一页的顶部到最后一页的底部仔细完整地再次阅读输出帮助。
  • 好的,执行clip /? 并阅读帮助您应该知道解决方案:clip < teszt2.csv。而已。或者你使用if exist "teszt2.csv" %SystemRoot%\System32\clip.exe < "teszt2.csv"。将未使用 UTF-16 LE 编码的文本文件的内容复制到剪贴板不需要 FOR 循环。只需执行clip.exe 并通过输入重定向从文件中读取文本数据。
  • 请记住在提问之前始终阅读命令的帮助文件。当一个人不知道的时候,这会让他们看起来很无知。直接来自帮助文件:CLIP < README.TXT Places a copy of the text from readme.txt on to the Windows clipboard.
  • Windows commandclip 的 Microsoft 文档和命令 clip 的 SS64 Windows CMD commands 文档均不包含有关文件大小限制的任何信息。所以我用文本编辑器 UltraEdit 创建了一个 58 622 440 字节的 CSV 文件,大约 55.9 GiB 772800 行。
  • 然后我使用了clip < test_input.csv 并且需要等待几分钟直到clip.exe 完成。它以仅 1024 字节 (1 KiB) 的块读取大型 CSV 文件 test_input.csv,并将每个块附加到已读取的数据中,这使得处理大文件的过程非常缓慢(数百万内存重新分配和内存中的数据复制)。但是clip.exe 终于完成了。然后我在 UltraEdit 中创建了一个新文件,粘贴了剪贴板内容并将文件保存为test_output.csv。两个文件的二进制比较没有返回差异。所以这么大的 CSV 文件没有问题。

标签: csv batch-file cmd


【解决方案1】:

如果您的目标是将 “原样” 您的 .csv 复制到剪贴板,只需运行

type "C:\path_to_your\my.csv" | clip

如果您想删除; 字符并添加一个空格,那么:

setlocal enabledelayedexpansion
for /f "usebackq tokens=* delims=" %%a in ("usedata\tmp1.txt") do (
   set "line=%%a"
   set "line=!line:;= !"
   echo/!line!>>tmp
)
type tmp | clip & del /q tmp


:end
endlocal
exit /b 0

【讨论】:

    【解决方案2】:

    问题似乎是您使用了DisableDelayedExpansion。我认为你应该使用EnableDelayedExpansion

    我稍微调整了代码(并为 .csv 使用了另一个名称):

    SETLOCAL ENABLEDELAYEDEXPANSION
    set clipboard=
    FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ test.csv"`) do (
        set clipboard=!clipboard! "var=%%a"
        SETLOCAL EnableDelayedExpansion
        set "var=!var:*:=!"
        echo(!var!
        ENDLOCAL
    )
    echo %clipboard%
    echo %clipboard% | clip
    
    

    使用此代码,包含以下内容的 .csv:

    a;b;c
    1qw;ads;f
    ads;d;da
    ads;asfas;afs
    

    像这样存储在剪贴板中:

     "var=1:a;b;c" "var=2:1qw;ads;f" "var=3:ads;d;da" "var=4:ads;asfas;afs" 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-14
      • 2011-01-03
      • 1970-01-01
      • 2014-07-19
      • 2020-05-15
      • 1970-01-01
      相关资源
      最近更新 更多