Avatar billede joemoz Nybegynder
26. november 2009 - 11:53 Der er 20 kommentarer og
1 løsning

Variabler fra tekstfil til database

Jeg har brug for en funktion der læser nogle linjer i en tekstfil og overfører dem til en database - f.eks. SQL.

Tekstfilen har - simplificeret - følgende udseende:

[begin file]
a1=GGG
b1=200
a2=LLL
b2=150
[end file]

Jeg har så brug for at hente filen ind i databasen så der laves én linje pr. nummer - det vil sige at tabellen kommer til at se sådan her ud:

ID    A                B
1 GGG          200
2 HHH          150


Processen skal køre løbende, dvs. der kommer hele tiden nye tekstfiler med stigende numre.

Hvordan kan jeg gøre det?

(Det behøver ikke nødvendigvis være i Visual Basic)
Avatar billede preppydude Nybegynder
26. november 2009 - 12:05 #1
Hvilken database? Eller vil du bare have programmet til at give dig en *.sql fil?
Avatar billede joemoz Nybegynder
26. november 2009 - 12:13 #2
Allerbedst var det hvis programmet direkte kunne sende data ind i f.eks. en SQL database, men alternativt kunne det også bare generere en ny kommasepareret fil hvor data står på den rigtige måde.
Avatar billede preppydude Nybegynder
26. november 2009 - 14:13 #3
Okay, er det muligt du kan sende mig en af de filer? Bare så jeg kan teste lidt.
Avatar billede joemoz Nybegynder
26. november 2009 - 14:32 #4
Jeg har faktisk ikke filerne endnu, men de kommer i princippet til at se ud som i mit eksempel.

Altså en tekstfil med dette indhold:

[begin_file]
a1=GGG
b1=200
a2=LLL
b2=150
a3=PPP
b3=147
[end_file]

Løbende kommer der så nye tekstfiler med samme format, og så fortløbende numre. Næste gang der importeres kunne den altså se sådan her ud:

[begin_file]
a4=GOO
b4=100
a5=AAG
b5=345
[end_file]
Avatar billede preppydude Nybegynder
26. november 2009 - 14:47 #5
Det var mere for at teste det jeg har lavet. Er nemlig ret sikker på det ikke virker helt som det skal. Gør det aldrig første gang med mig.. :D Men ja, jeg har prøvet at lave en fil med 18.000 "felter" som du har sat det op, og det tager ~2-3 sekunder.. er det ok?
Avatar billede joemoz Nybegynder
26. november 2009 - 14:55 #6
Det lyder super.
Avatar billede arne_v Ekspert
27. november 2009 - 04:20 #7
forslag:

Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.IO

Namespace E
    Public Class Program
        Public Shared Sub Process(constr As String, fnm As String)
            Using con As New SqlConnection(constr)
                con.Open()
                Using sr As New StreamReader(fnm)
                    Dim cmd As New SqlCommand("INSERT INTO dintbl VALUES(@a,@b)", con)
                    cmd.Parameters.Add("@a", SqlDbType.VarChar, 50)
                    cmd.Parameters.Add("@b", SqlDbType.Int)
                    Dim line As String
                    Dim aval As String = Nothing
                    Dim bval As Integer = 0
                    line = sr.ReadLine()
                    While line IsNot Nothing
                        Dim parts As String() = line.Split("="C)
                        If parts(0)(0) = "a"C Then
                            aval = parts(1)
                        ElseIf parts(0)(0) = "b"C Then
                            bval = Integer.Parse(parts(1))
                            cmd.Parameters("@a").Value = aval
                            cmd.Parameters("@b").Value = bval
                            cmd.ExecuteNonQuery()
                        End If
                        line = sr.ReadLine()
                    End While
                End Using
            End Using
        End Sub
        Public Shared Sub Main(args As String())
            Process("Server=ARNEPC3\SQLEXPRESS;Database=Test;Integrated Security=SSPI", "C:\data.txt")
            Console.ReadKey()
        End Sub
    End Class
End Namespace
Avatar billede joemoz Nybegynder
27. november 2009 - 14:34 #8
Tak for det. Undskyld min grænseløse uvidenhed, men hvordan kører jeg den? Jeg får at vide at "a project with an Output type of class library cannot be started directly". Jeg går ud fra at jeg skal lave en applikation der så kan kalde den, men hvordan er syntaksen helt præcis for det?
Avatar billede preppydude Nybegynder
27. november 2009 - 14:56 #9
Ah skidt, det jeg lavede var i Object Pascal og ikke VB.NET. :<
Avatar billede arne_v Ekspert
27. november 2009 - 15:05 #10
"a project with an Output type of class library cannot be started directly"

tyder på at det er et class library projekt og ikke et application project.

Men hele indholdet er i Sub Process. Resten er bare med som eksempel. Jeg regner med at du får kodet sat ind i din kontekst.
Avatar billede joemoz Nybegynder
29. november 2009 - 10:06 #11
Tak! Det virker faktisk - undskyld forvirringen før, jeg var kommet til at lave det som class library, tåbelig fejl, men jeg havde ikke lige gennemskuet den måde du havde sat det op på.

Send meget gerne et svar.

Lige én ting til: Jeg kunne faktisk godt tænke mig at få løbenummeret med også - altså så det bliver 'ID' i mit eksempel fra første post. Jeg kan ikke lige se hvordan jeg kan trække det med også?
Avatar billede arne_v Ekspert
29. november 2009 - 22:10 #12
svar
Avatar billede arne_v Ekspert
29. november 2009 - 22:11 #13
Dim id As Integer = Integer.Parse(parts(0).Substring(1))
Avatar billede joemoz Nybegynder
30. november 2009 - 16:51 #14
Tak. Et sidste spørgsmål: Hvad hvis der i nogle tilfælde ikke er alle værdier - altså at filen så sådan her ud:

[begin file]
a1=GGG
b1=200
b2=150
[end file]

Det ser ud til at programmet i så fald bare springer linjen over - hvordan får jeg den til at lave en linje og så bare lade A stå blank i anden linje?
Avatar billede joemoz Nybegynder
30. november 2009 - 20:53 #15
Hov nevermind jeg fandt ud af det.
Avatar billede joemoz Nybegynder
30. november 2009 - 21:39 #16
Jeg har dog lige et nyt problem - hvad hvis nogle af variablerne har flere tegn som navn? - programmet her ser kun ud til at kunne håndtere et tegn.

Altså:

[begin file]
a1=GGG
BCD1=123
a2=HHH
BCD2=456
[end file]
Avatar billede arne_v Ekspert
30. november 2009 - 21:51 #17
Hvis koden skal kunne klare andre prefix end "a" og "b" saa skal den udvides lidt. Man kunne f.eks. bruge regex til at finde tekst fremtil foerste tal.

Men er de prefix faste eller kan de variere?
Avatar billede joemoz Nybegynder
30. november 2009 - 22:00 #18
Nej de vil være faste når først de er kodet ind.

Hvordan bruger man regex?
Avatar billede joemoz Nybegynder
30. november 2009 - 22:25 #19
Ah - det ser ud til at virke hvis jeg bare bruger en simpel substring til at evaluere linjen i stedet for parts(0)(0). Lyder det ikke rimeligt?
Avatar billede arne_v Ekspert
01. december 2009 - 04:46 #20
Det kan bruges i en snæver vending.
Avatar billede arne_v Ekspert
01. december 2009 - 04:50 #21
Ellers vil:

Regex.Match(s, "[^\d]+")

returnere den første del af s som ikke indeholder tal.
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

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