Auslesen von CSV und Array exportieren in text file mit unterschiedlichen abständen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von tweber.

    Auslesen von CSV und Array exportieren in text file mit unterschiedlichen abständen

    Hallo zusammen,

    ich habe da ein kleines Problem.
    Ich möchte gerne eine CSV Datei auslesen anhand des Seperators.
    Dies habe ich gemacht und möchte diese nun in eine Text datei schreiben mit unterschiedlichen abständen.

    So siehst mein code im moment aus.

    VB.NET-Quellcode

    1. Sub ReadandWriteCSV()
    2. Dim finfo As New IO.DirectoryInfo(Loadpath)
    3. For Each fi In finfo.GetFiles(strTyp)
    4. Using csvParser As New TextFieldParser(fi.FullName)
    5. With csvParser
    6. .SetDelimiters(Delimiters)
    7. .HasFieldsEnclosedInQuotes = False
    8. Dim FieldData() As String
    9. Debug.WriteLine(fi.FullName)
    10. Do While Not .EndOfData()
    11. FieldData = .ReadFields()
    12. Dim csvFile() As String = fi.Name.Split(CChar(".csv"))
    13. Try
    14. Dim sw As System.IO.StreamWriter
    15. sw = FileSystem.OpenTextFileWriter(Savepath & csvFile(0) & ".arc", True)
    16. Dim MyString As String
    17. MyString = String.Join("", FieldData)
    18. sw.WriteLine(MyString)
    19. sw.Close()
    20. Catch ex As Exception
    21. End Try
    22. Loop
    23. End With
    24. End Using
    25. Next
    26. End Sub


    Wo ich das String.Join("", FieldData) mache setzt er mir alles in eine reihe.
    Nun brauche ich diese unterschiedlichen abstände die aus einer Config.xml datei kommen.

    Als Bsp.

    Array(0)
    Array(1)
    Array(2)

    4Zeichen lang, Startet auf Position1
    12Zeichen lang, Startet auf Position 34
    2Zeichen lang, Startet auf Position 52

    XXiX
    Bla bLa bla
    und so weiter




    Danke und Gruss

    Code -Tags korrigiert ~EaranMaleasi

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „EaranMaleasi“ ()

    @tweber Willkommen im Forum. :thumbup:
    Was verstehst Du unter "unterschiedlichen Abständen"?
    Mit String.PadLeft(...) und String.PadRight(...) kannst Du Strings auffüllen und so eine definierte Breite einstellen:
    docs.microsoft.com/de-de/dotnet/standard/base-types/padding
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    VB.NET-Quellcode

    1. Option Strict On
    2. Option Explicit On
    3. Imports System.Text
    4. Module Module1
    5. Sub Main()
    6. Dim t As String = "EINS;ZWEI;DREI"
    7. Dim tmp$
    8. Dim arr() As String
    9. arr = t.split(";"c)
    10. tmp = arr(0).PadRight(33)
    11. tmp &= arr(1).PadRight(18)
    12. tmp &= arr(2).PadRight(5)
    13. Debug.Print("123456789012345678901234567890123456789012345678901234567890")
    14. Debug.Print(tmp)
    15. End Sub
    16. End Module
    Hallo zusammen,

    Danke für eure Antworten.

    @Eierlein
    Die Idee ist gut aber ich benutze ein Array().
    Die Maximalen Zeilen sind auch immer Variable in den Files.

    FieldData() ist mein eigentliches Array.
    Was ich schon über .SetDelimiters(Delimiters) splitte.
    Mit MyString = String.Join(" ", FieldData) Joine ich das ganze.

    Jetzt hätte ich gerne beim Join(" ", FieldData) Bei dem Feldtrenner die Position.
    Da die Position aber unterschiedlich sind, ist es glaube ich so der Falsche ansatz.


    VB.NET-Quellcode

    1. Dim MyString As String
    2. MyString = String.Join(" ", FieldData)
    3. If Not MyString.Contains(Header) Then
    4. sw.WriteLine(MyString)
    5. End If



    So Sieht mein array im moment aus.

    NameWertTyp
    ◢FieldData{Length=6}String()
    (0)"60d16f7b36e3c703237fe7d7"String
    (1)"E000040323"String
    (2)"post"String
    (3)"2021-06-22T05:04:59"String
    (4)"4"String
    (5)"c4cbfe20-d036-11eb-a01a-0583e7cccfa5"String

    tweber schrieb:

    Die Idee ist gut aber ich benutze ein Array().
    Ja und?
    Poste mal den Inhalt Deiner CSV-Datei und das Resultat, wie es danach bei Dir aussehen soll.
    Benenne die relevanten Werte aus Deiner Config.xml-Datei.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hier der Inhalt des CSV.

    Quellcode

    1. event_id,ecm_id,event_name,created_at,schema_version,edoc_document_id
    2. 60d16f7b36e3c703237fe7d7,E000040323,post,2021-06-22T05:04:59,4,c4cbfe20-d036-11eb-a01a-0583e7cccfa5
    3. event_id,ecm_id,company_id,barcode,vendor_id,vendor_name,vendor_account,vendor_address_street,vendor_address_city,vendor_address_zip,invoice_type_id,invoice_type_text,confidential,workflow_type,external_number,internal_number,invoice_date,posting_date,currency,net_amount_1,vat_amount_1,vat_percent_1,net_amount_2,vat_amount_2,vat_percent_2,net_amount_3,vat_amount_3,vat_percent_3,net_amount_4,vat_amount_4,vat_percent_4,net_total,vat_total,gross,payment_terms_id,payment_terms_text,payment_discount_days,payment_discount_month,payment_discount_percent,payment_net_days,payment_net_month,payment_discount_use,payment_due_date,payment_discount_amount,payment_net_date,Mandantenspezifisch,finance_id
    4. 60d16f7b36e3c703237fe7d7,E000040323,SRS,ER10000272,L000012,"Strassenverkehrsamt Frauenfeld",L000012,"Moosweg 7a",Frauenfeld,8501,1,Rechnung,Nein,Kostenrechnung,RG1601130,ER10000272,2021-06-16,2021-06-22,CHF,736,56.67,7.7,0,0,0,0,0,0,0,0,0,736,56.67,792.65,030,"30 Tage netto",0,0,0,30,0,1,2021-07-16,0,2021-07-16,,100
    5. event_id,ecm_id,row_index,account,cost_center,net_amount,vat_amount,vat_percent,gross_amount,posting_text
    6. 60d16f7b36e3c703237fe7d7,E000040323,0,11012,757,200,15.4,7.7,215.4,"dies ist eine KST"
    7. 60d16f7b36e3c703237fe7d7,E000040323,1,11012,KA21000022,536,41.27,7.7,577.27,"dies ist ein KTR"


    Die überschriften brauche ich nicht.

    Hier wie es rauskommen soll.

    Quellcode

    1. XX100 210602 DIV 2L222286 V2SHB-hWI 210507 ER 00000000040,20+00000000000,00+ 92 V2SHB-hWI Lang Energie AG 001
    2. XX100 210602 SAB 040020 V2SHB-hWI 210507 ER 00000000037,33-00000000002,87- 92 V2SHB-hWI Lang Energie AG 2SA21805588 001
    3. XX100 210602 DIV 2L222505 _WOOP8fVX 210517 ER 00000000031,15+00000000000,00+ 999 _WOOP8fVX Brownbag lunch 13 Personen 001
    4. XX100 210602 SAB 065220 _WOOP8fVX 210517 ER 00000000030,10-00000000000,75- 95 _WOOP8fVX Brownbag lunch 13 Personen 1757 001
    5. XX100 210602 SAB 065220 _WOOP8fVX 210517 ER 00000000000,30-00000000000,00+ 97 _WOOP8fVX Brownbag lunch 13 Personen 1757 001
    6. XX100 210602 DIV 2L222286 nRPeFEbKb 210505 ER 00000000003,00+00000000000,00+ 92 nRPeFEbKb City-Garage AG St. Gallen 001
    7. XX100 210602 SAB 040020 nRPeFEbKb 210505 ER 00000000002,79-00000000000,21- 92 nRPeFEbKb City-Garage AG St. Gallen 2SA21805588 001


    Position1 ist immer das gleiche und die Berechnung sollte ab position2 losgehen.
    Hier die Positionen.



    Config.

    Quellcode

    1. <Loadpath>C:\tmp\Yokoy\Files\</Loadpath>
    2. <Savepath>C:\tmp\Yokoy\Backup\</Savepath>
    3. <Errorpath>C:\tmp\Yokoy\Error\</Errorpath>
    4. <logpath>C:\tmp\Yokoy\Log\</logpath>
    5. <strTyp>*.csv</strTyp>
    6. <Delimiters>,</Delimiters>
    7. <leseendung>.csv</leseendung>
    8. <schreibendung>.arc</schreibendung>
    9. <Header>event_id</Header>


    Weiterhin habe ich dort nur die Positionen und die Länge definiert.

    Gruss
    Thomas

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „tweber“ ()

    Hallo Thomas

    Wie du von der CSV zu deiner Ausgabe kommst ist mir ein Rätsel. Da gibt es keine übereinstimmenden Daten.
    Nichtsdestotrotz habe ich die erste Zeile deiner gewünschten Ausgabe genommen und sie per Code nachgestellt.

    VB.NET-Quellcode

    1. 'Die Erste Zeile deiner Ausgabe als Array
    2. Dim FieldData() As String = {"XX100", "210602", "DIV", "2L222286", "V2SHB-hWI", "210507", "ER", "00000000040,20+00000000000,00+", "92", "V2SHB-hWI", "Lang Energie AG", "", "001"}
    3. 'Die Position der einzelnen Strings gemessen nach deiner Ausgabe als Array (muss du wohl aus der Config.XML einlesen)
    4. Dim Position() As Integer = {1, 12, 34, 40, 69, 83, 95, 116, 161, 293, 338, 407, 461}
    5. Dim MyString As String = String.Empty
    6. 'Diese Schleife ersetzt dein String.Join()
    7. For i As Integer = 0 To FieldData.GetUpperBound(0)
    8. MyString = MyString.PadRight(Position(i) - 1) & FieldData(i)
    9. Next
    10. Debug.Print(MyString)