Avatar billede kasper_aaroe Nybegynder
28. september 2009 - 10:01 Der er 17 kommentarer og
1 løsning

ÆØÅ forsvinder når jeg skriver til txt fil

Hej eksperter,

Jeg sidder med et problem der virkeligt har givet mig grå hår - har lavet et program der skal lette arbejdsgangen for et par gutter her på arbejder, som i bund og grund går ud på at programmet skal tage de informationer det får at brugeren og skrive én ekstra linje ind på den rigtige plads i en txt fil på ca. 11.000 linje!

den linje der bliver insat indeholder bla. navne.

Det har jeg fundet en løsning på, og det virker perfekt, og dog - får mit program æøå ind i den linje der skal skrives til txt filen - så kommer æøå fint ind i txt filen.

Skriver jeg linjen igen (igen hvor linjen indeholder endten æ ø eller å) så kommer det også fint ind i txt filen - samt dem linje jeg lige har skrevet forinden, også står der unden problemer.

Sammen ligner jeg så den ændrede txt fil(med de 2 nye linjer) med en jeg ikke har skrevet til, så kan jeg se at ALLE linje der er skrevet manuelt ind som indeholder æøå er blevet ændret således at æ,ø eller å er skiftet ud med firkanter og andre tegn.


Fatter det simpelthen ikke..



Min funktioner:
Læser hele txt filen ind i et array (med encoding.UTF8)
Læser arrayet ind i en collection
Finder ud af hvor min linje skal ind
Sætter den ind i collectionen
skriver collection til txt line by line (med encoding.UTF8)
________________________________________________________


Det er en funktion på 216 linjer - så vil nok være lettere hvis i smider en mail til mig, så vil jeg sende koden til jer på mail, så kommer koden også i farve :)



Håber der er en med tid til et par spørgsmål der vil melde sig ind, på forhånd tak

Kasper
Avatar billede kasper_aaroe Nybegynder
28. september 2009 - 10:07 #1
Et par af de linje der bliver ødelangt, og som er skrevet ind manuelt (de bliver jo så reskrevet af mit program)
har erstattet dele af linjen da det ikke er noget der skal ligge på nettet.

løbenummer;afdelingskode;afdeling-N�rresundby;brugers navn;xxx;;initialer;;
løbenummer;afdelingskode;afdeling-N�rresundby;brugers navn;fso;;initialer;;

Et par af de linjer jeg har skrevet via mit program:
løbenummer;afdelingskode;afdeling-By;æøåæøå;f;;æøå;;
løbenummer;afdelingskode;afdeling-By;æøåæøå;f;;æøå;;
Avatar billede bvli Praktikant
28. september 2009 - 10:22 #2
Den eksisterende fil er garanteret skrevet med ANSI-encoding. Prøv at åbne den med den encoding.

I øvrigt kunne du ikke læse en linie ad gangen og finde ud af hvornår du skal indsætte din linie - eller er du nødt til at læse hele filen ind i memory?

  Private Sub DoSomethingWithText()
    Using inputStream As Stream = File.OpenRead("dinfil.txt")
      Using reader As TextReader = New StreamReader(inputStream, Encoding.[Default])
        Using outputStream As Stream = File.OpenWrite("TempFil.txt")
          Using writer As TextWriter = New StreamWriter(outputStream)
            Dim s As String
            While (s = reader.ReadLine()) <> Nothing
              If OpfylderBetingelsenForIndsætAfLinie(s) Then
                writer.WriteLine(DenLinieDerSkalIndsættes)
              End If
              writer.WriteLine(s)
            End While
          End Using
        End Using
      End Using
    End Using
  File.Move("dinfil.txt", "dinFil.txt.old")
  File.Move("TempFil.txt", "dinfil.txt")
End Sub
Avatar billede kasper_aaroe Nybegynder
28. september 2009 - 10:37 #3
læser hele filen ind i et array med denne linje:
Dim arr As String() = File.ReadAllLines(mfil, Encoding.UTF8)

Så læser den jo ind med en encoding - hvis det er hvad ud mener.
_______



Man kan sikkert godt nøjes med at finde den enkle linje jeg skal skrive noget ind på - men problemet er at jeg f.eks. vil oprette en ny enhed i ballerup afdelingen, så læser mit program alle linje ind i en collection, og kigger finder så alle linjer der starter med Bal (for ballerup), når den sidste linje er fundet der evt. hedder:
Bal0010 (løbenumret)
så fjernes Bal og der ligges én oven i 0010 så jeg får 0011.

Da programmet fandt den sidste ballerup entry, så gemte den også positionen i collectionen så jeg kan skrive til linjen lige under.


So - til sidst så skriver mit program en ny linje lige under den sidste ballerup entry med løbenumret Bal0011



Kan sende dig koden hvis det er lettere?
Avatar billede bvli Praktikant
28. september 2009 - 11:02 #4
Prøv i første omgang at skrifte "Encoding.UTF8" ud med "Encoding.Default".

Kodeeksemplet var mere inspiration, så du ikke behøvede at læse alt ind i hukommelsen for at arbejde med det. Du kan sagtens gøre som du gør - men du kan også forfine mit eksempel, hvis du får tid og lyst. :)

Men start med at prøve encodingen.
Avatar billede kasper_aaroe Nybegynder
28. september 2009 - 12:01 #5
tester lige, men tror jeg har prøvet med default også.

Ellers kan det være jeg skal have lidt hjælp med at få din kode til at virke jo mig - for nu hvor jeg har tilpasset det, så giver det mig en flot blank txt fil ;)
Avatar billede kasper_aaroe Nybegynder
28. september 2009 - 12:09 #6
Så blev det afprøvet, og resultatet.


Første skriv:

Alle ÆØÅ'er er der endnu og min nye bruger (kalle kanin;;ÆØÅ) står der:
Bal0287;afdelingskode;afdelingsby;kalle kanin;fso;;ÆØÅ;;

Linjene der manuelt er skrevet med æøå står også som de skal.



Anden skriv:

Den nye bruger (kalla kanin2;;ÆÆÆ) står der korrekt:
Bal0287;afdelingskode;afdelingsby;kalle kanin;fso;;ÆØÅ;;
Bal0288;afdelingskode;afdelingsby;kalle kanin2;fso;;ÆÆÆ;;

Alle andre ÆØÅ er smadret, selv den programmet selv har skrevet.


forstår ikke hvordan det kan gå godt første skriv, men ødelægge alt, anden skriv
Avatar billede bvli Praktikant
28. september 2009 - 12:17 #7
Du skriver også med den rigtige Encoding ikk'?

Regner med, at du bruger "File.WriteAllLines(col, Encoding.Default)" ?

og det er den samme metode du bruger til at skrive hver gang?
Avatar billede kasper_aaroe Nybegynder
28. september 2009 - 12:39 #8
Læs filen ind:
Dim arr As String() = File.ReadAllLines(mfil, Encoding.Default)

' konverter data fra array ind i collection
For Each Str As String In arr
    Col.Add(Str)
Next


Skriv filen igen(den gamle slettes først):

Dim sw As StreamWriter = File.CreateText(mfil)
  For Each str3 As String In Col
      If (str3 <> vbCrLf Or str3 <> "") Then
        sw.WriteLine(str3, Encoding.Default)
      End If
  Next
sw.Close()



Sådanne
Avatar billede bvli Praktikant
28. september 2009 - 12:56 #9
CreateText åbner stream'en med UTF-8 som encoding - du skriver med Ansi.

Prøv at åbne den med:
Dim sw As StreamWriter = new StreamWriter(mfil, Encoding.Default)
Avatar billede kasper_aaroe Nybegynder
28. september 2009 - 13:13 #10
Hmm den vil ikke lade mig lave et objekt af stramwriter når jeg har Encoding.Default med som parameter, så den er jeg nød til at bruge nede i for each lykken

'Skriv den nye fil
Dim sw As StreamWriter = New StreamWriter(mfil)
'Dim sw As StreamWriter = File.CreateText(mfil)
For Each str3 As String In Col
    If (str3 <> vbCrLf Or str3 <> "") Then
        sw.WriteLine(str3, Encoding.Default)
    End If
Next
sw.Close()



Men har lige prøvet igen, både med .Default og .UTF8 og giver samme resultat
Avatar billede bvli Praktikant
28. september 2009 - 13:24 #11
Det lyder ikke sandsynligt at du ikke kan bruge en Encoding parameter til constructor'en til din StreamWriter. (http://msdn.microsoft.com/en-us/library/aa328968%28VS.71%29.aspx)

Men jeg er nu stadig sikekr på, at det er et encoding-problem du har.
Avatar billede kasper_aaroe Nybegynder
28. september 2009 - 13:41 #12
Her er den fejl der kommer frem:
http://img200.imageshack.us/img200/8882/screenshot51eb.jpg


Du tror ikke det ville være lettere hvis jeg sendte dig koden der skriver til filen? istedet for jeg stikker dig kode stumper herinde :)
Avatar billede bvli Praktikant
28. september 2009 - 13:51 #13
:$ sorry.. Den skal jo have en Stream og en Encoding..

Dim s as Stream = new File.OpenWrite(mfil)
Dim sw As TextWriter = new StreamWriter(s, Encoding.Default)
Avatar billede kasper_aaroe Nybegynder
28. september 2009 - 14:08 #14
Hmm, heldet er bare ikke med mig for tiden, laver nu en anden fejl med default encoding - istedet for firkanter osv. så laver den spørgsmålstegn (?)


Koden som den ser ud nu:

Dim s As Stream = File.OpenWrite(mfil)
                    Dim sw As TextWriter = New StreamWriter(s, Encoding.UTF8)
                    For Each str3 As String In Col
                        If (str3 <> vbCrLf Or str3 <> "") Then
                            sw.WriteLine(str3)
                        End If
                    Next
                    sw.Close()
Avatar billede kasper_aaroe Nybegynder
28. september 2009 - 14:09 #15
Hov, havde lige prøver med UTF8 encoding, prøvede først med default
Avatar billede kasper_aaroe Nybegynder
28. september 2009 - 14:19 #16
omg.. nu ser der sku ud til at virke!

Tusind tak for hjælpen! smider du lige et svar så får du dine points :)
Avatar billede bvli Praktikant
28. september 2009 - 14:30 #17
Alt i orden :)

Jeg har selv siddet og været frustreret over den måde encoding virker (eller ikke virker) på. Er normalt tilhænger af at bruge en standard-encoding, men lige på windows (og hvis man skal kommunikere med andre programmer!) er det desværre næsten altid Encoding.Default som virker :s
Avatar billede kasper_aaroe Nybegynder
28. september 2009 - 14:38 #18
har nemligt også brugt åndsvagt meget tid på det, og når det er hoved delen af mit program, så har jeg intet andet kunne lave mens det har været sat ud :O

Well.. tak for hjælpen! :)
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