[英]How to remove blank rows from csv file using batch?
这是我第一次使用批处理文件进行编程,我被要求做一个能够将.xlsm文件转换为.csv的程序,而无需打开Excel即可。 为此,我使用以下.bat文件:
extoc.vbs integration.xlsm integration.csv
Taskkill /IM EXCEL.EXE /F
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
call :StripBlankLines "integration.csv"
goto :eof
:StripBlankLines
For %%x in ("%~1") do set OutF=integration_er.csv
if exist "%OutF%" del "%OutF%"
set FirstLine=1
for /F "usebackq delims=" %%B in (%*) do (
call :TrimWS %%B
if not "!Line!"=="" (
if "!FirstLine!"=="1" (
set FirstLine=0
) else (
>>"%OutF%" echo.
)
call :write !Line!
)
)
goto :eof
:TrimWS
set Line=%*
goto :eof
:write
>>"%OutF%"<NUL set /p Dummy=%*
goto :eof
与.vbs文件一起:
if WScript.Arguments.Count < 2 Then
WScript.Echo "Please specify the source and the destination files. Usage: ExcelToCsv <xls/xlsx source file> <csv destination file>"
Wscript.Quit
End If
csv_format = 6
Set objFSO = CreateObject("Scripting.FileSystemObject")
src_file = objFSO.GetAbsolutePathName(Wscript.Arguments.Item(0))
dest_file = objFSO.GetAbsolutePathName(WScript.Arguments.Item(1))
Dim oExcel
Set oExcel = CreateObject("Excel.Application")
Dim oBook
Set oBook = oExcel.Workbooks.Open(src_file)
oBook.SaveAs dest_file, csv_format
oExcel.Quit
oBook.Close False
这里的问题是,最终,我得到一个巨大的CSV,其中包含来自原始.xlsm文件的所有信息,但还有几行除了逗号以外没有其他内容,如下所示:
data, data, data,, data, data, data, data, data, data
data, data, data,, data, data, data, data, data, data
data, data, data,, data, data, data, data, data, data
data, data, data,, data, data, data, data, data, data
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
虽然我需要这样的东西:
data, data, data,, data, data, data, data, data, data
data, data, data,, data, data, data, data, data, data
data, data, data,, data, data, data, data, data, data
data, data, data,, data, data, data, data, data, data
我知道这些逗号来自excel中的空白行,但是我无法使用VBA宏删除excel中的所有空白行,因为这是一个巨大的工作表,并且每次尝试执行操作时PC都会崩溃。 因此,如果有某种方法可以通过VBS或BATCH解决此问题,我将非常高兴!
:TrimWS
set Line=%*
set "line=%line:,=%"
if defined line set "line=%*"
goto :eof
替换每个,
在line
什么也没有 。 如果结果为空,则line
不确定。 空的。 如果不是,请使用原始值重新加载。
顺便说一句-如果您将FirstLine
设置为无 ( set firstline="
)或其他任何东西 (什么都不是, 什么都不是 ),则可以使用if defined firstline
来检测其当前状态,因此您不需要delayedexpansion
。
(改写)
@echo off
SETLOCAL
call :StripBlankLines "integration.csv"
goto :eof
:StripBlankLines
For %%x in ("%~1") do set OutF=integration_er.csv
if exist "%OutF%" del "%OutF%"
set FirstLine=1
for /F "usebackq delims=" %%B in (%*) do (
call :TrimWS %%B
if defined line (
if defined firstline (
set "FirstLine="
) else (
>>"%OutF%" echo.
)
call :write %%B
)
)
goto :eof
:TrimWS
set Line=%*
set "line=%line:,=%"
goto :eof
:write
>>"%OutF%"<NUL set /p Dummy=%*
goto :eof
由于line
将包含与%%B
相同的line
,因此您可以使用%%B
前提是它不包含逗号。 因此,你可以寄发%%B
您:trimws
套路, line
会被设置为无 (在全逗号的情况下)或东西 (什么),否则。
然后,您可以简单地解释line
被定义或不输出%%B
通过您:write
程序,如:write
的时候才会被调用%%B
不包含所有逗号,但也不是空( for/f
会照顾的)。
设置firstline
在开始的东西意味着if defined firstline
将真正开始,所以将它设置为无 ,然后if defined firstline
将是错误的。
语法SET "var=value"
(值可能为空)用于确保分配的值中不包含任何杂散尾随空格。
应该保留setlocal
,以便在批处理例程运行时cmd
环境不会累积值。 它确保例程终止时对环境变量所做的任何更改都被丢弃
除非我有误会,为什么不只使用一行:
FindStr "[^,]" "integration.csv">"integration_er.csv"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.