我想做三件事:如果第2列和第3列中的值符合条件,则从一个CSV导入数据,根据映射键转换此数据,并将此转换后的数据输出到新的CSV中。
Sub in_out()
dim file_path as string
file_path = Worksheets("Sheet1").Range("A1").Value
open file_path for input as #1
row_count = 0
sheets("Sheet1").UsedRange.ClearContents
Range("A1").Select
Do Until EOF(1)
Line Input #1, Line_FromFile
Line_Items = Split(Line_FromFile, ",")
If Line_Item(2) = Worksheets("sheet1").Range("B2").Value And Line_Item(3) = Worksheets("sheet1").Range("C2").Value Then
ActiveCell.Offset(row_count, 0).Value = Line_Items(1)
ActiveCell.Offset(row_count, 1).Value = Line_Items(2)
row_count = row_count +1
Loop
else
row_count = row_count +1
Loop
end if
row_count = row_count +1
Loop
Close #1
End sub
答案 0 :(得分:3)
您可以考虑将SQL与ADODB-Connection一起使用,而不是仅使用VBA。对于大型CSV,这应该比循环每一行快得多。
像这样的SQL语句可以解决问题。
SELECT *
INTO [Text;DATABASE=L:\Out-Folder].tblOut.csv
FROM [Text;DATABASE=L:\In-Folder].tblIn.csv
WHERE column2 = criteria1 AND column2 = criteria2
请注意,您需要schema.ini-File来描述CSV的结构。这些设置起来相当简单快捷。
然后你可以
a)直接从MS Access运行所述SQL查询作为MS-Access查询
要么b)在MS Access-VBA中运行SQL,如下所示:
Dim sql As String
sql = "SELECT * INTO ... FROM ... WHERE ..."
CurrentDb.Execute sql, dbFailOnError
要么
c)如果必须使用Excel,则从Excel-VBA运行它。这将要求您首先设置ADODB.Connection,大致如下:
Dim MyConn As ADODB.Connection
Dim MyCmd As ADODB.Command
With MyConn
.Provider = "Microsoft.ACE.OLEDB.12.0"
.Open yourDB.accdb
End With
With MyCmd
Set .ActiveConnection = MyConn
.CommandText = strSQL
.CommandType = adCmdText
.Execute
End With
Set MyCmd = Nothing
Set MyConn = Nothing
一般说明:
请确保在开发期间备份原始CSV
由于您对每一行(单元格B2和C2)使用相同的过滤条件,因此调整SQL非常简单,可以像读取单元格内容一样完成(在Excel中)或者,例如,使用UserForm(在Access中)。
请注意,在c)中,我首先连接到一个名为yourDB.accdb
的ACCDB,这在我的代码中显然毫无意义,因为您可以使用the proper connection string直接连接到文本文件。但是,如果您计划执行某些映射,则可以在所述Access数据库中维护映射表,并在SQL中使用它们(使用Join)。
此外,我个人喜欢在这种情况下,任何路径信息都包含在SQL语句中,即使它的性能稍慢。
编辑:
当然,如果您希望将数据附加到Output-CSV(而不是替换它),您可以使用INSERT
- 这样的语句:
INSERT INTO [Text;DATABASE=L:\Out-Folder].tblOut.csv
SELECT *
FROM [Text;DATABASE=L:\In-Folder].tblIn.csv
WHERE column2 = criteria1 AND column2 = criteria2