Avatar billede nordjyden Nybegynder
09. december 2002 - 10:11 Der er 41 kommentarer og
1 løsning

import af linjesepareret tekstfil

Er der en smart måde, hvor man i Access97 kan importere en linjesepareret tekstfil?
Avatar billede hossein Nybegynder
09. december 2002 - 10:21 #1
filer---> hent eksterne data ----> resten følger du med
Avatar billede nordjyden Nybegynder
09. december 2002 - 10:26 #2
hossein > Er forsøgt, men jeg kan ikke finde linjeskift som afgrænser
Avatar billede hossein Nybegynder
09. december 2002 - 13:28 #3
læg en linie af din tekstfil!
Avatar billede nordjyden Nybegynder
09. december 2002 - 14:56 #4
Her ses et uddrag. En post består således af 19 linjer - bemærk ligeledes at værdien i et felt (linje) kan være blank :

80325
01/11/2002 
01/11/2002 
not used
not used
not used
not used
202
200
5
not used
2
not used
not used

not used
250.00
TG
920
80324
01/11/2002 
01/11/2002 
not used
not used
not used
not used
4520
4522
9
not used
5
not used
not used

not used
0.00
TG
10840
Avatar billede hossein Nybegynder
09. december 2002 - 16:10 #5
OK, det er lidt kedeligt. Mængden er sikkert stort. Men jeg kopi(ede) første linie og satte ind i Excel (her vælger jeg som tekst) derefter kopier jeg igen og indsætter som speciel også vælger jeg Transponer, så kommer de på en linie:
80325    01-11-02    01-11-02    not used    not used    not used    not used    202    200    5    not used    2    not used    not used        not used    250.00    TG    920
80324    01-11-02    01-11-02    not used    not used    not used    not used    4520    4522    9    not used    5    not used    not used        not used    0.00    TG    10840
Nu kan access læse den.
Ellers ved jeg ikke om man kan lave en funktion og klare dette opgave med det.
Avatar billede hossein Nybegynder
09. december 2002 - 16:40 #6
jeg gik ud fra at linier er lodret og ikke vandret? er det korrekt?
Avatar billede nordjyden Nybegynder
09. december 2002 - 16:40 #7
hossein > du har ret der er over 80.000 poster, som jeg ser dit forslag skal hver post kopieres separat over i excel. Med så mange poster er det en umulig opgave.
Avatar billede nordjyden Nybegynder
09. december 2002 - 16:43 #8
hossein > ja det er korrekt
Avatar billede hossein Nybegynder
09. december 2002 - 16:51 #9
Det program som udskriver dette fil, kan den ikke lave linie skift?
Avatar billede hossein Nybegynder
09. december 2002 - 17:07 #10
Jeg prøver at lave en funktion hvor man kan indsætte en linie skift i. det bliver nok i aften.
Avatar billede nordjyden Nybegynder
09. december 2002 - 17:11 #11
hossein> Filen leveres af ekstern leverandør. Formatet kan ikke umiddelbart ændres.
Avatar billede arne_v Ekspert
09. december 2002 - 18:05 #12
Ikke en database løsning, men lav et lille program i
C/C++/Java/C#/Pascal/Perl/whatever som læser 19 linier
oh skriver dem som 1 linie adskilt af et komma (eller en
anden separator).

Sommetider skal man være lidt pragmatisk og vælge den nemme
løsning.

Hvis du fortæller, hvilke sprog du har til rådighed, så
skal jeg gerne skrive det (hmm forudsætter det er
et sprohg jeg kender).
Avatar billede nordjyden Nybegynder
09. december 2002 - 18:24 #13
arne v > Udover lidt programmering i VBA på rimeligt simpelt niveau har jeg ingen sprog til rådighed - beklager. Men måske kan dit program lave en exe-fil.

Alle > Da jeg oprettede spørgsmålet - troede jeg der blot var tale om en indstilling, som jeg ikke kunne få øje på. Jeg kan nu se, at det ikke er så simpelt. - Jeg ønsker derfor at forhøje pointene - hvis en venlig sjæl vil fortælle mig hvordan og det iøvrigt ikke er i strid med nogen regler.
Avatar billede arne_v Ekspert
09. december 2002 - 18:26 #14
Jeg kan sagtens lave en EXE-fil, men jeg gik ud fra at du
gerne selv ville compile Og måske have mulighed for at rette
lidt til.
Avatar billede nordjyden Nybegynder
09. december 2002 - 18:30 #15
Arne V > Det ville jeg også gerne - men mine "sprogkundskaber" tillader det ikke :-)
Avatar billede arne_v Ekspert
09. december 2002 - 18:32 #16
Jeg skriver lige et lille C++ program så.
Avatar billede arne_v Ekspert
09. december 2002 - 19:00 #17
Det blev C ikke C++.

#include <stdio.h>
#include <string.h>

int main(int argc,char *argv[])
{
  FILE *fp1,*fp2;
  int i,ix;
  char buffer[1024];
  fp1 = fopen(argv[1],"r");
  fp2 = fopen(argv[2],"w");
  while(!feof(fp1)) {
      for(i=0;i<19;i++) {
        if(i>0) fputs(",",fp2);
        fgets(buffer,sizeof(buffer),fp1);
        ix=strlen(buffer);
        if(buffer[ix-1]=='\n') buffer[ix-1]='\x00';
        fputs(buffer,fp2);
      }
      fputs("\n",fp2);
  }
  fclose(fp1);
  fclose(fp2);
}
Avatar billede arne_v Ekspert
09. december 2002 - 19:02 #18
Oversat version på:
  http://80.199.19.48/arne/venddata.exe

Bygget med mingw gcc 3.1 på Win2000.
Avatar billede nordjyden Nybegynder
09. december 2002 - 19:04 #19
Jeg prøver lige at hente filen og vender tilbage.
Avatar billede nordjyden Nybegynder
09. december 2002 - 19:11 #20
Filen er hentet - kan du forklare hvordan den skal eksekveres. - jeg indrømmer blankt at jeg ikke fatter en brik af det som står ovenfor.
Avatar billede arne_v Ekspert
09. december 2002 - 19:21 #21
Du skriver bare:

venddata input-fil output-fil
Avatar billede nordjyden Nybegynder
09. december 2002 - 19:57 #22
Arne v > Det virker jo fint - men en lille ting - kan du ændre feltseperatoren til ; (semikolon).
Og så gerne lige en beskrivelse af hvordan jeg kan forhøje de udlovede point. Din hjælp går da vist langt ud over hvad man kan forvente.
Avatar billede hossein Nybegynder
09. december 2002 - 20:03 #23
En lille makro i Excel kan klare sagen, læg koden i en module, på selve Arken indsætter du en knap. Knap kalder makroen:

Private Sub CommandButton1_Click()
Call Makro1
End Sub

Den lægger du i en module:

Sub Makro1()
'
' Makro1 Makro
' Makro indspillet 09-12-2002 af Caroline
'

'
    Range("A1:A19").Select
    Selection.Copy
    Sheets("Ark2").Select
    Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
        False, Transpose:=True
    Rows("1:1").Select
    Application.CutCopyMode = False
    Selection.Insert Shift:=xlDown
    Sheets("Ark1").Select
    Rows("1:19").Select
    Selection.Delete Shift:=xlUp
End Sub

Når du trykker en gang så lægger den dataerne i Ark2, så skal du bare lave en løkke hvor den kan køre det antal gang som du vil for at hente fx: 80000 linier.

Sub Makro1()
'
' Makro1 Makro
' Makro indspillet 09-12-2002 af Caroline
'

'
    Range("A1:A5").Select
    Selection.Copy
    Sheets("Ark2").Select
    Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
        False, Transpose:=True
    Rows("1:1").Select
    Application.CutCopyMode = False
    Selection.Insert Shift:=xlDown
    Sheets("Ark1").Select
    Rows("1:6").Select
    Selection.Delete Shift:=xlUp
End Sub
Avatar billede hossein Nybegynder
09. december 2002 - 20:06 #24
ups den sidste del læser kun fra 1 til 5 linier, glem den sidste del.
Avatar billede terry Ekspert
09. december 2002 - 20:40 #25
first, I havent read ALL comments and answers but as I see it Excel can NOT be used for this as it has a max row of 65000 or there abouts. I also notice that you say that ONE "post" record is = 19 line. Well I would make a function which reads in a line at a time and puts each line into the record. Continue reading a line at a time until all lines are read.
Avatar billede hossein Nybegynder
09. december 2002 - 20:45 #26
Terry>> 80000 / 2 = 40000
Avatar billede hossein Nybegynder
09. december 2002 - 20:48 #27
Når jeg laver, excel siger OK!
Avatar billede arne_v Ekspert
09. december 2002 - 20:50 #28
Jeg laver en version med semikolon.
Avatar billede terry Ekspert
09. december 2002 - 20:53 #29
why the f... waist time using other "tools" when Access can do it?
Avatar billede terry Ekspert
09. december 2002 - 20:54 #30
and 80000/4 = ? :o)
Avatar billede arne_v Ekspert
09. december 2002 - 20:54 #31
En version med semikolon er klar på samme URL.
Avatar billede hossein Nybegynder
09. december 2002 - 21:00 #32
The main thing is to solve the problem and by excel it just take 5,5 sec. :O)))))))
Avatar billede nordjyden Nybegynder
09. december 2002 - 21:04 #33
Problemet er løst. Arne V's løsning fungerer fint. Filen omdannes til en semikolonsepareret fil som kan importeres i access. Der er muligvis mange andre måder at gøre det på - men denne fungerer i hvert fald.

Takker mange gange for den store hjælp - det har været en oplevelse. - Og som tidligere nævnt giver jeg gerne flere point - fortæl mig bare hvordan - jeg vil ikke træde nogen over tæerne.
Avatar billede arne_v Ekspert
09. december 2002 - 21:06 #34
Nu var det faktisk ikke så stort et arbejde.

Men hvis du vil give flere point, så har jeg ihvertfald
tidligere set at der er oprettet nye spørgsmål med
titel "point til xxxx" og en link til det original spørgsmål.
Avatar billede terry Ekspert
09. december 2002 - 21:07 #35
nordyden>If Arne's answer works, and he is happy with the points then I see no reason why you need to give more, he after all gave you what you wanted
Avatar billede nordjyden Nybegynder
09. december 2002 - 21:16 #36
Ok - så sparer jeg pointene :-)
Håber jeg i stedet kan bidrage med noget fornuftigt en dag (men det er nok tvivlsom når jeg er oppe imod jer)
Avatar billede arne_v Ekspert
09. december 2002 - 21:22 #37
terry er iøvrigt en af dem jeg har set der har fået ekstra point
en gang imellem !
Avatar billede hossein Nybegynder
09. december 2002 - 21:46 #38
Arne_v det er meget smart, det virker bedre end access i hvert fald :)
Avatar billede terry Ekspert
09. december 2002 - 21:55 #39
arne_v I have received extra points a number of tiome, and I have NOTHING at all agains nordjyden giving you more butthats up to him not me.

and this is for NO points nordjyden.
You need a table named table1 with 19 fields named fld1 to fld19 type text.

Private Sub Command0_Click()
Dim fls(19) As String
Dim i As Integer
Dim sSQL As String

Open "C:\somefile.txt" For Input As #1

On Error GoTo Err_exit

Do While Not EOF(1)    ' Loop until end of file.
   
    For i = 1 To 19
        fls(i) = ""
    Next i

    For i = 1 To 19
        Input #1, fls(i)
       
    Next i

Err_exit:

    sSQL = "INSERT INTO Table1 (fld1,fld2,fld3,fld4,fld5, fld6,fld7,fld8,fld9,fld10,fld11,fld12,fld13,fld14,fld15, fld16,fld17,fld18,fld19)VALUES ("
    sSQL = sSQL & "'" & fls(1) & "','" & fls(2) & "',"
    sSQL = sSQL & "'" & fls(3) & "','" & fls(4) & "',"
    sSQL = sSQL & "'" & fls(5) & "','" & fls(6) & "',"
    sSQL = sSQL & "'" & fls(7) & "','" & fls(8) & "',"
    sSQL = sSQL & "'" & fls(9) & "','" & fls(10) & "',"
    sSQL = sSQL & "'" & fls(11) & "','" & fls(12) & "',"
    sSQL = sSQL & "'" & fls(13) & "','" & fls(14) & "',"
    sSQL = sSQL & "'" & fls(15) & "','" & fls(16) & "',"
    sSQL = sSQL & "'" & fls(17) & "','" & fls(18) & "','" & fls(19) & "')"
   
    DoCmd.RunSQL sSQL
   
   
   
Loop

' Close before reopening in another mode.




Close #1

End Sub
Avatar billede terry Ekspert
09. december 2002 - 21:56 #40
I hope you can see what is happening, as you may need to do some alterations yourself
Avatar billede terry Ekspert
09. december 2002 - 22:00 #41
If access prompts you before INSERT then change

DoCmd.RunSQL sSQL

to
docmd.setwarnings false
DoCmd.RunSQL sSQL
docmd.setwarnings true
Avatar billede nordjyden Nybegynder
09. december 2002 - 22:14 #42
Terry > Tak. - Jeg vil kigge nærmere på din kode i morgen.
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