我正在使用宏将Microsoft Access数据库中的表导出到csv文件,以便导入到mysql数据库中。我最终使用了一个批处理文件,它会在导出发生之前在文本文件中放置一个标记,然后将最后一个标记之后的所有内容放入一个新文件中。这样可以正常工作,除了访问不附加的事实,但每次都会重新创建文件,因此不可能使用任何类型的标记。
有没有办法,使用访问或批处理文件或其他任何方式,a)强制访问附加到文件,或放置自己的标记,或b)每次导出到不同的文件,可能是filename是一个变量,例如日期,或者c)通过外部操作来克服这种行为
答案 0 :(得分:3)
您可以简单地创建一些代码来打开文件,然后将数据附加到其中,而不是使用宏来导出表格。
如何使用
只需将代码复制到应用程序中的VBA模块,然后像这样调用它:
' Export the Table "Orders" to "orders.csv", appending the data to the '
' existing file if there is one. '
ExportQueryToCSV "Orders", "C:\orders.csv", AppendToFile:=True
' Export the result of the query to "stock.csv" using tabs as delimiters '
' and no header or quotes around strings '
ExportQueryToCSV "SELECT * FROM Stock WHERE PartID=2", _
"C:\stock.csv", _
AppendToFile:=False, _
IncludeHeader:=False, _
Delimiter:=chr(9), _
QuoteString:=false
<强>代码强>
'----------------------------------------------------------------------------'
' Export the given query to the given CSV file. '
' '
' Options are: '
' - AppendToFile : to append the record to the file if it exists instead of '
' overwriting it (default is false) '
' - Delimiter : what separator to use (default is the coma) '
' - QuoteString : Whether string and memo fields should be quoted '
' (default yes) '
' - IncludeHeader: Whether a header with the field names should be the first '
' line (default no) '
' Some limitations and improvements: '
' - Memo containing line returns will break the CSV '
' - better formatting for numbers, dates, etc '
'----------------------------------------------------------------------------'
Public Sub ExportQueryToCSV(Query As String, _
FilePath As String, _
Optional AppendToFile As Boolean = False, _
Optional Delimiter As String = ",", _
Optional QuoteStrings As Boolean = True, _
Optional IncludeHeader As Boolean = True)
Dim db As DAO.Database
Dim rs As DAO.RecordSet
Set db = CurrentDb
Set rs = db.OpenRecordset(Query, dbOpenSnapshot)
If Not (rs Is Nothing) Then
Dim intFile As Integer
' Open the file, either as a new file or in append mode as required '
intFile = FreeFile()
If AppendToFile And (Len(Dir(FilePath, vbNormal)) > 0) Then
Open FilePath For Append As #intFile
Else
Open FilePath For Output As #intFile
End If
With rs
Dim fieldbound As Long, i As Long
Dim record As String
Dim field As DAO.field
fieldbound = .Fields.count - 1
' Print the header if required '
If IncludeHeader Then
Dim header As String
For i = 0 To fieldbound
header = header & .Fields(i).Name
If i < fieldbound Then
header = header & Delimiter
End If
Next i
Print #intFile, header
End If
' print each record'
Do While Not .EOF
record = ""
For i = 0 To fieldbound
Set field = .Fields(i)
If ((field.Type = dbText) Or (field.Type = dbMemo)) And QuoteStrings Then
record = record & """" & Nz(.Fields(i).value, "") & """"
Else
record = record & Nz(.Fields(i).value)
End If
If i < fieldbound Then
record = record & Delimiter
End If
Set field = Nothing
Next i
Print #intFile, record
.MoveNext
Loop
.Close
End With
Set rs = Nothing
Close #intFile
End If
Set rs = Nothing
Set db = Nothing
End Sub
请注意,它并不完美,您可能需要调整代码以反映您希望如何格式化数据,但在大多数情况下默认值应该没问题。
答案 1 :(得分:1)
a)强制访问附加到文件,或放置自己的标记
没有。导出每次都要写一个全新的文件,如果文件已经存在则会出现问题。
b)每次导出到不同的文件,可能文件名是变量,如日期
是的,将路径/文件名构建为字符串,并将日期/时间附加到结尾
c)通过外部操作克服这种行为
好吧,您可以将新文件转储到虚拟文件中,然后使用批处理脚本或系统调用:
echo marker >> goodfile.csv
type dummy >> goodfile.csv
del dummy
但是,如果您只是想添加新记录,那么更好的方法就是处理虚拟文件,而不是尝试寻找最后一个标记并处理下面的所有内容。
答案 2 :(得分:0)
您还可以使用VBScript执行用于导出的查询,并将这些记录附加到现有文件中。