Avatar billede annpro Nybegynder
02. december 2003 - 00:52 Der er 23 kommentarer og
1 løsning

Tilføj linje i en csv fil

Jeg skal brugen en kode, som jeg kan sætte ind i en komandoknap i access, som tilføjer en linje i toppen af en csv fil, da csv filen ikke har feltoverskrifter, den skal f.eks tilføje følgende:

Felt1;Felt2;Felt3;Felt4;Felt5;Felt6

csv filen, hvor databasen skal tilføje denne linje i hedder e:\test.csv, bemærk at csv fil i forvejen indeholder en masser data.
Avatar billede overchord Nybegynder
02. december 2003 - 12:27 #1
Det bliver nok temmeligt svaert. Jeg tror den bedste mulighed vil vaere enten at gen-eksportere hvis det kommer fra din DB eller at hente hele indholdet af filen in, skrive headers efterfulgt af data til en ny fil.
Avatar billede annpro Nybegynder
02. december 2003 - 13:26 #2
Det er ikke muligt cvs filen, leveres nemlig fra et firma, som ikke mener at de kan lave om på opsætningen af filen.
Avatar billede fynbohans Nybegynder
02. december 2003 - 14:10 #3
Du som åbner csv-filen som en almindelig textfil og gemmer den igen. Se Visual Basic Hjælp under "Open Statement"; Mode = Binary.
Hvis du kalder den hentede fil Text, gemmer du den som Felt1;Felt2;Felt3;Felt4;Felt5;Felt6 & Text.
Avatar billede annpro Nybegynder
02. december 2003 - 14:22 #4
Mit hjælp virker ikke i min access, men kan du ikke give mig sætningen, den fil, som jeg får fra leverandøren hedder f.eks. test.csv
Avatar billede fynbohans Nybegynder
02. december 2003 - 14:25 #5
Laver og tester koden.
Avatar billede annpro Nybegynder
02. december 2003 - 14:29 #6
takker mange gange, du er sku en rigtig kammerat
Avatar billede overchord Nybegynder
02. december 2003 - 14:33 #7
Denne metode skulle kunne bruges til at importere alt, indsaette header-navne foerste i filen derefeter indsskrive alt indholdet

open "Nytest.csv" for output as #1

write #1, Felt1, Felt2, Felt3, Felt4, Felt5, Felt6

open "test.csv" for input as #2

while not eof(#2)

input #2, Var1, Var2, Var3, Var4, Var5, Var6
write #1, Var1, Var2, Var3, Var4, Var5, Var6

wend

close #1
close #2
Avatar billede annpro Nybegynder
02. december 2003 - 14:54 #8
Det der virker da ikke ?? den stopper i linjen hvor der stå write #1 ved punktet felt1

Private Sub Kommandoknap0_Click()
    Dim sFileName As String
    Open "c:\programmer\vkar2003\Nytekst.csv" For Output As #1
    Write #1, Felt1, Felt2, Felt3, Felt4, Felt5, Felt6
    Open "c:\programmer\vkar2003\x1.csv" For Input As #2
    while not eof(#2)
    Input #2, Var1, Var2, Var3, Var4, Var5, Var6
    Write #1, Var1, Var2, Var3, Var4, Var5, Var6
    Wend
    Close #1
    Close #2
    DoCmd.TransferText acImportDelim, "Vkar", "X1", "c:\programmer\vkar2003\Nytest.csv"
    DoCmd.Close acForm, Me.Name
   
End Sub
Avatar billede annpro Nybegynder
02. december 2003 - 14:55 #9
fynbohans og overchord er det samme person?
Avatar billede overchord Nybegynder
02. december 2003 - 15:21 #10
ok wrte #1, "Felt1", "Felt2", .... osv

Ellers leder den efter varable kaldet felt1-6 istedet.

Nej vi er ikke samme person. Beklager  -jeg havde ikke set at fynbohans var igang med en kode - hans er sikkert mere brugbar :-)
Avatar billede overchord Nybegynder
02. december 2003 - 15:22 #11
Husk ogsaa at dimme alle var's

Dim Var1 as ...
Dim Var2 as ...

(alt afhaengigt af formaterne i din fil)
Avatar billede fynbohans Nybegynder
02. december 2003 - 16:01 #12
Har desværre ikke haft mulighed for at afprøve følgende, men har vistnok koden
liggende på en anden computer, som jeg først har adgang til i aften:

Private Sub HENT_Click()
            Dim Filnr As Long
            Dim Filnavn As String
            Dim EnPost As String
            Dim FeltNr1 As String
            Dim FeltNr2 As Single
            Dim Text As String
           
            FeltNr1 = [Felt1] 'tekst
            FeltNr2 = [Felt2] 'tal med decimaler
           
            EnPost = Chr(34) & FeltNr1 & Chr(34) & ";" & CSng(FeltNr2)
           
            Filnr = FreeFile
            Filnavn = "c:/mappe/test.csv"
           
            Open Filnavn For Binary Access Read As #Filnavn
            Get #Filnr, , Text
            Close #Filnavn
           
            Text = EnPost & vbCrLf & Text
            Kill Filnavn
            Open Filnavn For Binary Access Write As #Filnavn
            Put #Filnr, , Text
            Close #Filnavn
End Sub

Der er kun vist 2 felter og du skal være opmærksom på følgende:
1. Det vigtiske er du laver en sikkerhedkopi af din csv-fil.
  Linjen med "Kill" sletter filen før en ny gemmes - hvis et eller andet går
  galt. 
2. I en csv-fil er der anførselstegn omkring tekst, men ikke omkring
  tal, derfor chr(34) ved tekst.
3. Der skal bruges forskellige c-funktioner her Csng. Ved heltal skal
  der bruges Clng.
Avatar billede fynbohans Nybegynder
02. december 2003 - 16:12 #13
Close #Filnavn skal være Close #Filnr
Avatar billede annpro Nybegynder
02. december 2003 - 17:22 #14
Jeg får en kørsels fejl 13 "Type stemmer ikke overens" i den første linje hvor der står open filnavn, min opbygning af filen indeholder alle kolonner tekst på nær kolonne nr 3 som indeholder valuta, har det noget med det at gøre? jeg har vedhæftet min kode herunder, så du kan se hvad jeg har gjort ved den.

Private Sub Kommandoknap0_Click()
            Dim txtFilnavn As String
            Dim Filnr As Long
            Dim Filnavn As String
            Dim EnPost As String
            Dim FeltNr1 As String
            Dim FeltNr2 As String
            Dim FeltNr3 As String
            Dim FeltNr4 As String
            Dim FeltNr5 As String
            Dim FeltNr6 As String
            Dim Text As String
           
            FeltNr1 = "Felt1" 'tekst
            FeltNr2 = "Felt2" 'tal med decimaler
            FeltNr3 = "Felt3" 'tekst
            FeltNr4 = "Felt4" 'tekst
            FeltNr5 = "Felt5" 'tekst
            FeltNr6 = "Felt6" 'tekst
           
            EnPost = Chr(34) & FeltNr1 & Chr(34) & FeltNr2 & Chr(34) & FeltNr3 & Chr(34) & FeltNr4 & Chr(34) & FeltNr5 & Chr(34) & FeltNr6
           
            Filnr = FreeFile
            Filnavn = "e:\dokumenter\dokumenter\resprisliste2003semik.csv"
           
            Open Filnavn For Binary Access Read As #Filnavn
            Get #Filnr, , Text
            Close #Filnr
           
            Text = EnPost & vbCrLf & Text
            Kill Filnavn
            Open Filnavn For Binary Access Write As #Filnavn
            Put #Filnr, , Text
            Close #Filnr

    DoCmd.TransferText acImportDelim, "Vkar", "X1", txtFilnavn
    DoCmd.Close acForm, Me.Name

   
End Sub
Avatar billede fynbohans Nybegynder
02. december 2003 - 19:12 #15
Blev desværre afbrudt flere gange da jeg skrev mit svar.
Fejlen skyldes at linjen skal være:

Open Filnavn For Binary Access Read As #Filnr
og tilsvarende
Open Filnavn For Binary Access Write As #Filnr
# er et nummertegn og skal altså følges af et tal.

Konverteringsfunktionen for valuta er CCur, dvs CCur(Felt2).
Og så mangler der et par anførselstegn og alle skilletegn mangler:

EnPost = Chr(34) & FeltNr1 & Chr(34) & ";" & CCur(Felt2) & ";" _ Chr(34) & FeltNr3 & Chr(34) & ";" & Chr(34) & FeltNr4 & _
Chr(34) & ";" & Chr(34) & FeltNr5 & Chr(34) & ";" & Chr(34) & _
FeltNr6 & ";".

Tester det senere i aften.
Avatar billede fynbohans Nybegynder
02. december 2003 - 19:15 #16
Ombrydningener ændret efter at det er sendt.
" _" skal kun være der ved linjeskift!
Avatar billede fynbohans Nybegynder
02. december 2003 - 22:41 #17
Desværre var der også en sammenblanding med et andet programeringssprog jeg bruger meget, men følgende er testet og
virker:

Private Sub CSV_KNAP_Click()
            Dim Filnr As Long
            Dim Filnavn As String
            Dim EnPost As String
            Dim FeltNr1 As String
            Dim FeltNr2 As Single
            Dim Text As String
         
            FeltNr1 = [FELT1] 'tekst
            FeltNr2 = [FELT2] 'tal med decimaler
         
            EnPost = Chr(34) & FeltNr1 & Chr(34) & ";" & _ CSng(FeltNr2)   
         
            Filnr = FreeFile
            Filnavn = "c:/dokumenter/test.csv"
         
            Open Filnavn For Binary As #Filnr
            Text = Input(LOF(Filnr), #Filnr)
            Close #Filnr
                       
            Text = EnPost & vbCrLf & Text
            Kill Filnavn
            Open Filnavn For Binary As #Filnr
            Put #Filnr, , Text
            Close #Filnr
End Sub

Eksemplet er med de oprindelig 2 felter.
Avatar billede fynbohans Nybegynder
02. december 2003 - 22:43 #18
også her skal &_ fjernes.
Avatar billede annpro Nybegynder
02. december 2003 - 23:19 #19
Det virker fint nok, bortset fra at den overskriver noget af den oprindelige 1. linje fra filen, kan man gøre et eller andet i write funktionen så felt1;felt2 osv slutter med et linje skift og så indsætter teksten?
Avatar billede thesurfer Nybegynder
02. december 2003 - 23:24 #20
Linieskift hedder vbCrLf.
Avatar billede thesurfer Nybegynder
02. december 2003 - 23:25 #21
f.eks.:
Text = EnPost & vbCrLf & Text & vbCrLf
Avatar billede fynbohans Nybegynder
02. december 2003 - 23:39 #22
Virker fint hos mig. Hvordan ser du fejlen? I Excel eller Notesblok?
Er du sikker på at feltet med valuta virkelig er valuta(med kr. foran)
og ikke Reeelt tal (Single)?
Avatar billede thesurfer Nybegynder
03. december 2003 - 01:49 #23
fynbohans> du behøver ikke at vælge "Fortsat svar" hele tiden.. du kan stadig bruger "Kommentar".. lige som alle andre..
Avatar billede annpro Nybegynder
03. december 2003 - 01:54 #24
Det virker fint nu takker til fynbohans
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester