mysql - Adskiller data fra en konstant tilføjet fil til en ny fil

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg bruger en makro til at eksportere et bord i en Microsoft Access-database til en csv-fil for at importere til en mysql-database. Jeg endte med at bruge en batchfile, der ville placere en markør i tekstfilen før eksporten fandt sted, og derefter placere alt efter den sidste markør i en ny fil. Dette virker fint, bortset fra at adgangen ikke tilføjer, men genskaber filen hver gang, så det er umuligt at bruge nogen form for markør.


Er der på nogen måde, at bruge adgangs- eller batchfiler eller hvad som helst, for enten a) at tvinge adgang til at føje til en fil eller at placere en egen markør eller b) eksportere til en anden fil hver gang, muligvis filnavnet er en variabel som datoen eller c) overvinde denne adfærd med ekstern manipulation

Bedste reference


I stedet for at bruge en makro til at eksportere tabellen, kunne du simpelthen oprette en kode for at åbne filen og tilføje dataene til den.


Sådan bruges


Du skal blot kopiere koden til et VBA-modul i din ansøgning og kalde det sådan:


' 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


Kode


'----------------------------------------------------------------------------'
' 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


Bemærk at det ikke er perfekt, og du skal muligvis tilpasse koden for at afspejle, hvordan du ønsker at dataene skal formateres, men standardværdierne skal i de fleste tilfælde være fint.

Andre referencer 1


a) tvinge adgang til at føje til en fil, eller at placere en egen markør


Nej. Eksporten forventer at skrive en helt ny fil hver gang og har problemer, hvis filen allerede eksisterer.


b) Eksporter til en anden fil hver gang, muligvis filnavnet er en variabel som datoen


Ja, bygg stien/filnavnet op som en streng, og tilføj datoen/klokkeslættet til slutningen


c) overvinde denne adfærd med ekstern manipulation


Nå, du kan dumpe ud, hvad der er nyt for en dummy-fil, og derefter med et batch script eller systemopkald, der gør:


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


Men hvis du bare vil tilføje de nye optegnelser, ville en bedre måde over alt være at bare behandle dummyfilen i stedet for at forsøge at søge den sidste markør og behandle alt under det.

Andre referencer 2


Du kan også bruge VBScript til at udføre forespørgslen, du bruger til at eksportere, og tilføje disse poster til en eksisterende fil.