从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

我需要弄清楚如何从.csv文件中删除最后一行。它基本上只是一行空白,但它正在扰乱导入过程。我使用以下脚本做了两件事:(1)将.xls文件转换为.csv,然后(2)从.csv文件中删除最后一行。第一部分工作正常,但第二部分没有从文件中删除最后一行。如果不删除最后一行,我做错了什么

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