如何通过VBA删除CSV指定行 或将CSV导入Excel的Data工作表
VBA处理CSV需求实现方案
1. 直接删除CSV中指定行的实现方案
完全可以直接通过VBA修改CSV文件删除符合条件的行,无需导入Excel。实现逻辑为:先读取CSV表头确定pipeline_point_code字段的列索引,再逐行读取原CSV内容,跳过字段值为30000001PC的行,将剩余内容写入临时文件,最后用临时文件覆盖原CSV即可。
你可以把以下代码添加到原有代码的End Sub之前即可生效:
' --------------- 直接删除CSV中pipeline_point_code为30000001PC的行 --------------- Dim fso As Object, tsIn As Object, tsOut As Object Dim header As Variant, colIndex As Integer Dim lineContent As String, lineArr As Variant Dim tempFile As String ' 创建文件系统对象 Set fso = CreateObject("Scripting.FileSystemObject") tempFile = Path1 & "temp_csv_file.csv" ' 打开原CSV读取,创建临时文件写入 Set tsIn = fso.OpenTextFile(File_Name1, 1, False, -2) ' -2对应系统默认编码,中文乱码可改成-1(UTF-16)或者65001(UTF-8) Set tsOut = fso.CreateTextFile(tempFile, True, False) ' 读取表头确定pipeline_point_code的列索引 If Not tsIn.AtEndOfStream Then header = Split(tsIn.ReadLine, ",") For i = LBound(header) To UBound(header) If Trim(header(i)) = "pipeline_point_code" Then colIndex = i Exit For End If Next ' 写入表头到临时文件 tsOut.WriteLine Join(header, ",") End If ' 逐行处理内容 Do While Not tsIn.AtEndOfStream lineContent = tsIn.ReadLine lineArr = Split(lineContent, ",") ' 跳过符合删除条件的行 If Trim(lineArr(colIndex)) <> "30000001PC" Then tsOut.WriteLine lineContent End If Loop ' 关闭文件流 tsIn.Close tsOut.Close ' 用临时文件覆盖原CSV,删除临时文件 fso.DeleteFile File_Name1 fso.MoveFile tempFile, File_Name1 Set fso = Nothing
2. 将CSV导入到"Data"工作表的实现方案
如果你需要先把CSV内容导入Excel处理,可以使用以下代码,同样添加到原有代码的End Sub之前即可:
' --------------- 将CSV内容导入Data工作表 --------------- Dim ws As Worksheet Dim importQry As QueryTable ' 指定Data工作表,不存在的话会自动创建 On Error Resume Next Set ws = ThisWorkbook.Worksheets("Data") If Err.Number <> 0 Then Set ws = ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)) ws.Name = "Data" End If On Error GoTo 0 ' 清空原有内容 ws.Cells.Clear ' 导入CSV文件 Set importQry = ws.QueryTables.Add(Connection:="TEXT;" & File_Name1, Destination:=ws.Range("A1")) With importQry .TextFileParseType = xlDelimited .TextFileCommaDelimiter = True ' CSV用逗号分隔 .TextFileColumnDataTypes = Array(xlTextFormat) ' 所有列按文本格式导入避免格式错乱 .Refresh BackgroundQuery:=False End With ' 清理查询对象 importQry.Delete Set importQry = Nothing
注意:如果CSV有中文乱码问题,可以在导入代码的
With importQry块中添加一行.TextFilePlatform = 65001指定为UTF-8编码,或者改为936对应GBK编码。
内容的提问来源于stack exchange,提问作者WorkerGuy21
相关产品推荐
相关产品推荐

