从CSV中删除最后一行
我需要弄清楚如何从.csv文件中删除最后一行。它基本上只是一行空白,但它正在扰乱导入过程。我使用以下脚本做了两件事:(1)将.xls文件转换为.csv,然后(2)从.csv文件中删除最后一行。第一部分工作正常,但第二部分没有从文件中删除最后一行。如果不删除最后一行,我做错了什么从CSV中删除最后一行,csv,vbscript,scripting,Csv,Vbscript,Scripting,我需要弄清楚如何从.csv文件中删除最后一行。它基本上只是一行空白,但它正在扰乱导入过程。我使用以下脚本做了两件事:(1)将.xls文件转换为.csv,然后(2)从.csv文件中删除最后一行。第一部分工作正常,但第二部分没有从文件中删除最后一行。如果不删除最后一行,我做错了什么 Const ForReading = 1 Const ForWriting = 2 Set ExcelObj = CreateObject("Excel.Application") ExcelObj.DisplayAle
Const ForReading = 1
Const ForWriting = 2
Set ExcelObj = CreateObject("Excel.Application")
ExcelObj.DisplayAlerts = False
ExcelObj.Visible = false
ExcelObj.Workbooks.Open "C:\convert\ovations.xls"
ExcelObj.Workbooks(1).SaveAs "C:\convert\edited\TEST.csv", 6
ExcelObj.Workbooks.Close
ExcelObj.Quit
Set objFSo = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:\convert\edited\TEST.csv", ForReading)
strContents = objFile.ReadAll
objFile.Close
arrLines = Split(strContents, vbCrLf)
Set objFile = objFSO.OpenTextFile("C:\convert\edited\TEST.csv", ForWriting)
For i = 0 to UBound(arrLines) - 1
objFile.WriteLine arrLines(i)
Next
objFile.Close
当CSV文件的最末端有一个CRLF序列时(这种情况下),
Split()
将生成该CRLF后面的一个部分,即空字符串
然后,您拥有的循环省略了额外的空白字符串,但仍然保留了CRLF之前的内容,WriteLine
本身也会生成最终的CRLF,因此您最终得到的结果完全相同
如果确实要省略最后一行,则必须从Split
结果中少生成两行,而不是少生成一行:
正如他们在文章中指出的,您可以调整直线
For i = 0 To UBound(arrLines) - 1
到
代码可能会起作用,因为之前没有考虑最后一个回车换行符
但值得指出的是,通过调试问题很容易解决这一问题
- 如果循环的行为不符合预期,请检查您提供的数据
使用
或WScript.Echo
输出数组MsgBox()
中的行数,然后与源文件进行比较,如果它们不匹配,则知道有额外的行arrLines
通过一些简单的调试,您可以在几分钟内解决这个问题。您可能希望避免For循环(对于大文件)
最后一行也可以在Excel中删除(在
xl.Workbooks(1).saveascsv,6
行之前)
使用If语句检查您试图筛选出的值。是否可能CSV中的行未以
vbCrLf
结尾,或者最后一行也以vbCrLf
结尾?如果遇到Len(arrLines(i)&“<1
,请尝试UBound(arrLines)-2
或增量i
。更正了答案。是在之后吗?我现在刚读了你的评论。最后一行肯定以CrLf
结尾:这是Excel编写CSV的方式。注意:开始键入之前,您是否阅读了问题评论框中显示的建议文本?;-)这是一个建议,不是一个答案。这很有效!谢谢不过我不得不把它改成-3。
For i = 0 To UBound(arrLines) - 1
For i = 0 To UBound(arrLines) - 2
Option Explicit
Const ForReading = 1
Const ForWriting = 2
Const txt = "C:\convert\ovations.xls"
Const csv = "C:\convert\edited\TEST.csv"
Dim xl, fso, fsoFile, fileTxt, lastCR, i
Set xl = CreateObject("Excel.Application")
xl.DisplayAlerts = False
xl.Visible = False
xl.Workbooks.Open txt
xl.Workbooks(1).SaveAs csv, 6
xl.Workbooks.Close
xl.Quit
Set fso = CreateObject("Scripting.FileSystemObject")
Set fsoFile = fso.OpenTextFile(csv, ForReading)
fileTxt = fsoFile.ReadAll
fsoFile.Close
Set fsoFile = fso.OpenTextFile(csv, ForWriting)
fsoFile.Write Left(fileTxt, InStrRev(fileTxt, vbCrLf, Len(fileTxt) - 1))
fsoFile.Close
With xl.Workbooks(1).Worksheets(1)
.Rows(.UsedRange.Rows.Count).Delete
End With