【问题标题】:Batch File Running Slow When Creating Text File创建文本文件时批处理文件运行缓慢
【发布时间】:2018-03-08 21:40:50
【问题描述】:

我有一个批处理文件,它将 Excel 电子表格转换为制表符分隔的文本文件,删除第一行文本(标题),并执行 SQL Server 存储过程,该过程使用 BULK INSERT 语句将文本文件导入表。

运行时的所有结果都是正确的,但是删除第一行文本的部分运行速度非常慢。我的测试文件大约有 1500 行,创建一个 335 KB 的 txt 文件大约需要 35 秒。

cscript ExcelToTxt.vbs %dSourceFilePath% %dTemp%

for /f "skip=1 delims=*" %%a in (%dTemp%) do (
    echo %%a >>%dDestinationFilePath%
)

脚本将 Excel 文件转换为文本文件 %dTemp%,然后在创建最终文件时跳过该文件的第一行。我是否错过了一些减慢速度的东西?或者我有更好的方法来完成这个吗?该脚本的所有其他部分都运行得与我预期的一样快。

【问题讨论】:

  • 添加代码以跳过vbscript的第一行并直接写入目标文件。如果您真的需要速度,请不要使用 VB 或批处理脚本,将其编写为可编译为本机可执行文件的内容,或者查找已经完成您正在尝试做的事情的众多程序之一。
  • 你为什么有delims=*
  • 如果它少于 65,000 行,那么使用 MORE 命令跳过第一行会快得多。但我原以为可以对您的 SQL 过程进行编程以跳过标题记录。我的数据库人员使用我发送给他们的所有文件来执行此操作。在您当前的代码中,如果您也进行一次重定向,它会更快。 (for /f "skip=1 delims=*" %%a in (%dTemp%) do echo %%a)>%dDestinationFilePath%
  • 我的测试文件很小,但文件可能超过 65,000 行。我认识到有更好的方法可以做到这一点,但我在数据库之外的经验很少,所以这对我来说是进入新的领域。我试图尽量减少目前每天将数据从供应商报告移动到 SQL Server 的手动步骤。我愿意接受其他想法和建议!

标签: batch-file cmd vbscript


【解决方案1】:

两个选项供您选择。

1) 更改现有代码,使其不会为您输出到输出文件的文件的每一行打开和关闭文件句柄。

(for /f "skip=1 delims=" %%a in (%dTemp%) do echo %%a)>%dDestinationFilePath%

2) 如果输入文件少于 65,000 行,请使用 MORE 命令。

more +1 %dTemp% >%dDestinationFilePath%

【讨论】:

  • 第一个对我来说效果很好。谢谢!花了几秒钟来运行 30,000 行。对于我自己的教育,括号是否使它在打开文件之前完成 for 循环?
【解决方案2】:

您可以使用 Powershell 跳过第一行。

SET "dTemp=thefile.txt"
SET "dDestinationFilePath=zzz.txt"
powershell -NoLogo -NoProfile -Command ^
    "Get-Content %dTemp% |" ^
    "Select-Object -Skip 1 |" ^
    "Set-Content %dDestinationFilePath%"

Get-Content 的默认 -ReadCount 现在是 1。因此,这对于读取大文件也应该很好。

【讨论】:

  • 对于我需要转换以导入 SQL Server 的文件,它们已高达 100,000 行。这并不是说它们永远不会变大。从长远来看,我会研究一个 .Net 脚本或类似的东西。我没有那里的经验,批处理文件+vbscript似乎是我短期内最快的路径。
  • 我更改了关于大文件的评论。请让我知道这是否适合您。
猜你喜欢
  • 1970-01-01
  • 2016-02-05
  • 1970-01-01
  • 1970-01-01
  • 2013-08-31
  • 2010-09-17
  • 1970-01-01
  • 2013-09-25
  • 1970-01-01
相关资源
最近更新 更多