Разделение данных из постоянно добавляемого файла в новый файл - PullRequest
4 голосов
/ 13 февраля 2009

Я использую макрос для экспорта таблицы из базы данных Microsoft Access в файл csv для импорта в базу данных mysql. В итоге я использовал пакетный файл, который помещал маркер в текстовый файл до экспорта, а затем помещал все после последнего маркера в новый файл. Это работает нормально, за исключением того факта, что доступ не добавляется, но каждый раз воссоздает файл, поэтому невозможно использовать любой вид маркера.

Есть ли способ, используя доступ или пакетные файлы или что-либо еще, либо: а) принудительно получить доступ для добавления в файл, либо разместить собственный маркер, либо б) каждый раз экспортировать в другой файл, возможно, переменная filename, такая как дата, или c) преодолеть это поведение с помощью внешних манипуляций

Ответы [ 3 ]

3 голосов
/ 15 февраля 2009

Вместо того, чтобы использовать макрос для экспорта таблицы, вы можете просто создать некоторый код для открытия файла и добавить к нему данные.

Как использовать

Просто скопируйте код в модуль 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 голос
/ 13 февраля 2009

а) разрешить доступ для добавления в файл или для размещения собственного маркера

Нет. При экспорте ожидается запись нового файла каждый раз, и возникают проблемы, если файл уже существует.

b) каждый раз экспортировать в другой файл, возможно, имя файла является переменной, такой как дата

Да, построить путь / имя файла в виде строки и добавить дату / время в конец

в) преодолеть это поведение с помощью внешних манипуляций

Что ж, вы могли бы выбросить то, что является новым для фиктивного файла, а затем с помощью пакетного сценария или системного вызова, который выполняет:

echo marker >> goodfile.csv
type dummy >> goodfile.csv
del dummy

Однако, если вы просто хотите добавить новые записи, лучшим способом было бы просто обработать фиктивный файл, вместо этого пытаясь найти последний маркер и обработать все, что ниже этого.

0 голосов
/ 13 февраля 2009

Вы также можете использовать VBScript для выполнения запроса, который вы используете для экспорта, и добавить эти записи в существующий файл.

...