Batch file 创建文本文件时批处理文件运行缓慢

Batch file 创建文本文件时批处理文件运行缓慢,batch-file,cmd,vbscript,Batch File,Cmd,Vbscript,我有一个批处理文件,它将Excel电子表格转换为以制表符分隔的文本文件,删除第一行文本(标题),并执行SQL Server存储过程,该存储过程使用大容量INSERT语句将文本文件导入表中 运行时的所有结果都是正确的,但是删除第一行文本的部分运行速度非常慢。我的测试文件大约有1500行,创建一个335kb的txt文件大约需要35秒 cscript ExcelToTxt.vbs %dSourceFilePath% %dTemp% for /f "skip=1 delims=*" %%a in (%

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

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

cscript ExcelToTxt.vbs %dSourceFilePath% %dTemp%

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

脚本将Excel文件转换为文本文件
%dTemp%
,然后在创建最终文件时跳过该文件的第一行。我是不是错过了什么让事情变慢的东西?还是有更好的方法让我完成这一任务?此脚本的其他部分的运行速度与我预期的一样快。

两个选项供您选择

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

(for /f "skip=1 delims=" %%a in (%dTemp%) do echo %%a)>%dDestinationFilePath%
2) 如果输入文件少于65000行,请使用
MORE
命令

more +1 %dTemp% >%dDestinationFilePath%

两个选项供您选择

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

(for /f "skip=1 delims=" %%a in (%dTemp%) do echo %%a)>%dDestinationFilePath%
2) 如果输入文件少于65000行,请使用
MORE
命令

more +1 %dTemp% >%dDestinationFilePath%

您可以使用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。因此,这对于读取大文件也应该很好。

您可以使用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。因此,这也适用于读取大型文件。

添加代码以跳过vbscript的第一行并直接写入目标文件。如果您确实需要速度,请不要使用VB或批处理脚本,将其写入编译为本机可执行文件的程序中,或者从许多程序中找到一个已经完全完成您正试图执行的操作的程序。为什么有
delims=*
?如果少于65000行,则使用
MORE
命令跳过第一行会快得多。但我认为您的SQL过程可以编程为跳过头记录。我的db人员使用我发送给他们的所有文件来执行此操作。在您当前的代码中,如果您也执行一个重定向,则速度会快得多<代码>(对于/f“skip=1 delims=*”%%a in(%dTemp%)do echo%%a)>%d目标文件路径%我的测试文件很小,但文件可能超过65000行。我知道有更好的方法可以做到这一点,但我在数据库之外的经验很少,所以这对我来说是一个新领域。我正在尽量减少目前每天将数据从供应商报告移动到SQL Server中所采取的手动步骤。我愿意接受其他想法和建议!添加代码以跳过vbscript的第一行并直接写入目标文件。如果您确实需要速度,请不要使用VB或批处理脚本,将其写入编译为本机可执行文件的程序中,或者从许多程序中找到一个已经完全完成您正试图执行的操作的程序。为什么有
delims=*
?如果少于65000行,则使用
MORE
命令跳过第一行会快得多。但我认为您的SQL过程可以编程为跳过头记录。我的db人员使用我发送给他们的所有文件来执行此操作。在您当前的代码中,如果您也执行一个重定向,则速度会快得多<代码>(对于/f“skip=1 delims=*”%%a in(%dTemp%)do echo%%a)>%d目标文件路径%我的测试文件很小,但文件可能超过65000行。我知道有更好的方法可以做到这一点,但我在数据库之外的经验很少,所以这对我来说是一个新领域。我正在尽量减少目前每天将数据从供应商报告移动到SQL Server中所采取的手动步骤。我愿意接受其他想法和建议!第一个现在对我来说很好用。谢谢花了几秒钟的时间,就完成了30000行。就我自己的教育而言,括号是否使它在打开文件之前完成了
For
循环?第一个循环目前对我很有效。谢谢花了几秒钟的时间,就完成了30000行。就我个人而言,括号是否使它在打开文件之前完成了
For
循环?对于我需要转换为导入SQL Server的文件,它们的行数高达100000行。但这并不是说它们永远不会变大。从长远来看,我将研究.Net脚本或类似的东西。我在这方面没有经验,批处理文件+vbscript似乎是短期内最快的路径。我更改了关于大文件的注释。请让我知道这是否适用于您。对于我需要转换为导入到SQL Server的文件,它们已大到100000行。但这并不是说它们永远不会变大。从长远来看,我将研究.Net脚本或类似的东西。我在这方面没有经验,批处理文件+vbscript似乎是短期内最快的路径。我更改了关于大文件的注释。请让我知道这是否适合你。