Avatar billede jens_bach Nybegynder
10. oktober 2005 - 23:55 Der er 23 kommentarer og
1 løsning

XML som database (log)

Hej...

hvordan laver man dette

1. skiv "start" til et XML dokument
2. Skiv "opdateret"

loop omkring dette
3. slet sidste record (sidste punkt 2)
2. Skiv "opdateret"



de færdige data skal se ca sådan ud

type        tid
start        10:45:38 1.10.2005
opdateret    11:47:21 5.11.2005
start        11:49:31 5.11.2005
opdateret    21:19:40 12.12.2005

------------------------------------
Avatar billede arne_v Ekspert
10. oktober 2005 - 23:58 #1
XML er ikke velegnet som permanent log fordi enten skal du genskrive hele filen
hele tiden eller så skal den være permanent åben og dermed ikke valid XML førend
den lukkes (eller så skal du lave et hack !)

Har du læst min artikel om brug af XML i VB.NET ?

(den løser ikke lige umiddelbart dit problem, men giver lidt
overblik over værktøjskassen)
Avatar billede jens_bach Nybegynder
11. oktober 2005 - 00:03 #2
hmm, jeg har læst den men kunne ikke lige gemmen skue hvordan. der var jo en som hade lavet nået som liner det jeg ledte efter (http://www.eksperten.dk/artikler/562)

hvad skal jeg så bruge ?
Avatar billede arne_v Ekspert
11. oktober 2005 - 00:05 #3
han læser hele filen ind og genskriver den for hver append
Avatar billede arne_v Ekspert
11. oktober 2005 - 00:05 #4
XmlDocument Load & Save
Avatar billede jens_bach Nybegynder
11. oktober 2005 - 00:08 #5
kunne man så skive pungt 3 til en fil fx. en lille text dokument og der efter overskive den igen ?
Avatar billede arne_v Ekspert
11. oktober 2005 - 00:10 #6
hvorfor bruge XML ?

hvis du skriver til en simpel komma separeret fil, så erdet nemt at appende
Avatar billede arne_v Ekspert
11. oktober 2005 - 00:10 #7
og nemt at læse igen !
Avatar billede jens_bach Nybegynder
11. oktober 2005 - 00:12 #8
hvordan :) ?
Avatar billede arne_v Ekspert
11. oktober 2005 - 00:13 #9
jeg prøver lige at lave et eksempel
Avatar billede jens_bach Nybegynder
11. oktober 2005 - 00:14 #10
fedt
Avatar billede arne_v Ekspert
11. oktober 2005 - 00:26 #11
Imports System
Imports System.IO
imports System.Threading

Public Class MainClass
    Public Shared Sub Main(ByVal args As String())
        ' sådan læser man og udregner
        Dim sr As StreamReader = New StreamReader("C:\test.dat")
        Dim line1 As String
        Dim line2 As String
        line1 = sr.ReadLine
        line2 = sr.ReadLine
        While line1 <> Nothing
            Dim line1parts() As String = line1.Split(",".ToCharArray)
            Dim line2parts() As String = line2.Split(",".ToCharArray)
            Dim t1 As DateTime = DateTime.Parse(line1parts(1))
            Dim t2 As DateTime = DateTime.Parse(line2parts(1))
            Dim dt As TimeSpan = t2.Subtract(t1)
            Console.WriteLine("Tid = " & dt.TotalSeconds)
            line1 = sr.ReadLine
            line2 = sr.ReadLine
        End While
        sr.Close
        ' sådan skriver man en ny
        Dim sw As StreamWriter = New StreamWriter("C:\test.dat", True)
        sw.WriteLine("start," + DateTime.Now.ToString("HH:mm:ss dd.MM.yyyy"))
        Thread.Sleep(5000)
        sw.WriteLine("opdateret," + DateTime.Now.ToString("HH:mm:ss dd.MM.yyyy"))
        sw.Close
    End Sub
End Class
Avatar billede arne_v Ekspert
11. oktober 2005 - 00:27 #12
den venten 5 sekunder skal selvfølgelig erstattes af hvad det nu er du måler

programmet skal nok også ved læsning rettes til at kunne håndtere at der kun
er start og ikke opdateret

hvis det er lange intervalle så skal sw nok lukkes mellem skrivning af start og
opdateret

men det er jo nemt at tilrette
Avatar billede jens_bach Nybegynder
11. oktober 2005 - 00:31 #13
takker.

men kunne man ikke lave det sådan at programmet bare skriv DateTime til filen og der efter overskriv det der stod i filen, for hvis den køre i 300 dage så bliver det til en del log :)

og der efter hendte det ind næste gang man startede programmet, og ligge det over i en  xml fil ???

er det en løsning eller er det hul i.... ?
Avatar billede jens_bach Nybegynder
11. oktober 2005 - 00:34 #14
det programmet skal er at måle oppe tid. på en service mm
Avatar billede arne_v Ekspert
11. oktober 2005 - 00:35 #15
du kan ret nemt konvertere sådan en komma separeret fil til XML

overskrive den sidste række er som sagt lidt af et hack

men det kan gøres

så kan du dog stort set lige så godt bare skrive den i XML
Avatar billede arne_v Ekspert
11. oktober 2005 - 00:35 #16
men det må blive imorgen

:-)
Avatar billede jens_bach Nybegynder
11. oktober 2005 - 00:45 #17
arne_v: men det må blive imorgen -> ja

det jeg mendte var nået lig dette

1. start programmet
    læs filen med dato-tid og skiv det til XML filen
2. skiv ny Start til XML filen

loop
3. skiv ny dato til filen


-----

er jeg helt på afveje eller ...
Avatar billede arne_v Ekspert
11. oktober 2005 - 10:14 #18
her er er et eksempel som kan opdatere den sidste linie i en komma separeret fil:

Imports System
Imports System.IO
Imports System.Text
imports System.Threading

Public Class MainClass
    Public Shared Sub ReadAndShow()
        Dim sr As StreamReader = New StreamReader("C:\test.dat")
        Dim line1 As String
        Dim line2 As String
        line1 = sr.ReadLine
        line2 = sr.ReadLine
        While line1 <> Nothing
            Dim line1parts() As String = line1.Split(",".ToCharArray)
            Dim line2parts() As String = line2.Split(",".ToCharArray)
            Dim t1 As DateTime = DateTime.Parse(line1parts(1))
            Dim t2 As DateTime = DateTime.Parse(line2parts(1))
            Dim dt As TimeSpan = t2.Subtract(t1)
            Console.WriteLine("Tid = " & dt.TotalSeconds)
            line1 = sr.ReadLine
            line2 = sr.ReadLine
        End While
        sr.Close
    End Sub
    Public Shared Sub AppendOne()
        Dim sw As StreamWriter = New StreamWriter("C:\test.dat", True)
        sw.WriteLine("start," + DateTime.Now.ToString("HH:mm:ss dd.MM.yyyy"))
        sw.WriteLine("opdateret," + DateTime.Now.ToString("HH:mm:ss dd.MM.yyyy"))
        sw.Close
    End Sub
    Public Shared Sub UpdateLast()
        Dim s As String = "opdateret," + DateTime.Now.ToString("HH:mm:ss dd.MM.yyyy") & Convert.ToChar(13) & Convert.ToChar(10)
        Dim fs As FileStream = New FileStream("C:\test.dat", FileMode.Open, FileAccess.ReadWrite)
        fs.Seek(-s.Length, SeekOrigin.End)
        fs.Write(Encoding.Default.GetBytes(s), 0, s.Length)
        fs.Close
    End Sub
    Public Shared Sub Main(ByVal args As String())
        ReadAndShow
        AppendOne
        Thread.Sleep(5000)
        UpdateLast
    End Sub
End Class
Avatar billede arne_v Ekspert
11. oktober 2005 - 10:14 #19
men skifter du til dne teknik kan du lige så godt bruge XML fordi begrundelsen
for komma separaret fremfor XML var at man kunne appende uden at fuske

man kan appende til en XML på samme måde - det er bare lidt mere bøvlet
Avatar billede jens_bach Nybegynder
11. oktober 2005 - 22:03 #20
takket mange gange, ligger du et svar
Avatar billede arne_v Ekspert
11. oktober 2005 - 22:04 #21
gerne
Avatar billede arne_v Ekspert
11. oktober 2005 - 22:05 #22
Har du iøvrigt overvejet med komma separeret løsningen bare at
appende og så lade læse programmet tage start og den sidste tilhørende
opdateret ?
Avatar billede jens_bach Nybegynder
11. oktober 2005 - 22:25 #23
ja fordi programmet skal køre 24/7 365 og ca hver 1 min. det vil give en ret stor log
(31536000 linjer på et år), så hvis man skulle dette så skulle man også lave en cleaner til logen...

og hvis det kun er sidset linje der bliver lavet om så er støste log ca 1000 linjer max på et år.
Avatar billede jens_bach Nybegynder
11. oktober 2005 - 22:26 #24
jeg har opretted et spørsmål mere ;) med hvordan jeg hiver de data ud som jeg gerne vil se. http://www.exp.dk/spm/655236
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
Kurser inden for grundlæggende programmering

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