Autor Thema: Beim einlesen von CSV-Datei Zeilen addieren  (Gelesen 7684 mal)

john doh

  • Gast
Beim einlesen von CSV-Datei Zeilen addieren
« am: 07.07.08 - 11:05:26 »
Hallo zusammen,

die CSV sieht ungefähr so aus:

...;"14";...;"Rechnungbetrag Firme 1";...;15,99 €
...;"14";...;"blah blah";...;
...;"14";...;"blah blah";...;
...;"14";...;"Rechnungbetrag Firme 2";...;;;0,99 €
...;"14";...;"blah blah";...;
...;"14";...;"Rechnungbetrag Firme 3";...;;100,99 €

Mein Problem sieht so aus, alle Zeilen mit gleicher Kartennr (in diesem Fall 14) und dem Wort "Rechnungsbetrag" sollen addiert werden. Die Eurobeträge stehen an VERSCHIEDENEN Positionen.
Das ist mein bisherigen Code:

Sub Initialize
   Dim uiws As New NotesUIWorkspace
   Dim session As New notessession
   Dim db As notesdatabase
   Dim doc As notesdocument
   Dim view As NotesView
   Dim fileNum As Integer
   Dim fileName As Variant
   Dim InputStr As String
   Dim delimiter As String
   Dim FieldArray  As Variant
   
   Set db = session.currentdatabase
   Set view = db.GetView ("abgleich")
   fileNum% = Freefile()
   fileName = uiws.OpenFileDialog(True, "CSV-Datei auswählen", "CSV Files|*.CSV", "C:\")
   delimiter = ";"
   
   Open fileName(0) For Input As fileNum%
   Line Input #1,  InputStr$
   
   Do While Not Eof(fileNum%)
      Line Input #1,  InputStr$
      FieldArray = Split(Replace(inputstr$ ,Chr(34),""),delimiter,-1,0)
      
      If  Not Isempty(FieldArray) Then
         If Instr (InputStr$,"Rechnungsbetrag") > 0 Then
            Set doc = view.GetDocumentByKey(fieldarray(2))
            If Not doc Is Nothing Then
               Call doc.ReplaceItemValue("status", "Abgleich am "+Now)
               Call doc.ReplaceItemValue("puffer", fieldarray(18))
               Call doc.Save(True,True)
            End If
         End If
      End If
      
   Loop
   
   Close fileNum%
End Sub

Ich hab nicht den leisesten Schimmer, wie ich das realisieren soll.

Matthias
« Letzte Änderung: 09.07.08 - 15:05:07 von john doh »

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Beim einlesen von CSV-Datei Zeilen addieren
« Antwort #1 am: 07.07.08 - 11:09:52 »
Dann muss Du Dir einen Parser bauen:
- Prüfen, ob in Array (x) die gewünschte Kartennummer steht. Wenn nein -> nächste Zeile
- Prüfen, ob in FieldArray (y) "Rechnungsbetrag" steht. Wenn nein -> nächste Zeile
- Alle folgenden Elemente des Arrays durchsuchen, ob dort das Euro-Zeichen steht.
- Wenn ja, alle Zeichen ausser Ziffern und Komma eliminieren, Double-Wert bilden und addieren.

HTH,
Bernhard

john doh

  • Gast
Re: Beim einlesen von CSV-Datei Zeilen addieren
« Antwort #2 am: 07.07.08 - 13:41:20 »
Der code aus meinen 1. Post, macht der das nicht (bis aufs addieren)?

Matthias

klaussal

  • Gast
Re: Beim einlesen von CSV-Datei Zeilen addieren
« Antwort #3 am: 07.07.08 - 13:45:54 »
Zitat
Der code aus meinen 1. Post, macht der das nicht (bis aufs addieren)?

Böse Falle. Seinen eigenen Code sollte man schon kennen + was der macht.

john doh

  • Gast
Re: Beim einlesen von CSV-Datei Zeilen addieren
« Antwort #4 am: 07.07.08 - 15:04:53 »
@ Bernhard

Manchmal bin ich sooo doof.  ;D
JETZT, wo ich endlich verstanden habe wie Du das meinst, werde ich mich voller Tatendrang dransetzen. Falls ich Schwierigkeiten haben sollte, werd ich nochmal nach Hilfe schreien.
Vielen Dank für den Schups in die richtige Richtung.

Matthias
« Letzte Änderung: 08.07.08 - 09:12:20 von john doh »

john doh

  • Gast
Re: Beim einlesen von CSV-Datei Zeilen addieren
« Antwort #5 am: 08.07.08 - 09:55:20 »
- Prüfen, ob in Array (x) die gewünschte Kartennummer steht. Wenn nein -> nächste Zeile
- Prüfen, ob in FieldArray (y) "Rechnungsbetrag" steht. Wenn nein -> nächste Zeile
- Alle folgenden Elemente des Arrays durchsuchen, ob dort das Euro-Zeichen steht.
- Wenn ja, alle Zeichen ausser Ziffern und Komma eliminieren, Double-Wert bilden

Soweit alles hinbekommen, nur das mit dem addieren will nicht so klappen.






Offline DerAndre

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.655
  • Geschlecht: Männlich
  • Keep cool!
Re: Beim einlesen von CSV-Datei Zeilen addieren
« Antwort #6 am: 08.07.08 - 09:56:41 »
Was bedeutet nicht so klappen?
André

Elterninitiative diabetischer Kinder und Jugendlicher e.V.
-----------------------------------------------------------------------------
Fliegen ist die Kunst auf den Boden zu Fallen, aber daneben.
-----------------------------------------------------------------------------
Etwas mehr Hardware dazu zu kaufen ist viel billiger als
Software besser zu machen. ( Niklaus Wirth )

john doh

  • Gast
Re: Beim einlesen von CSV-Datei Zeilen addieren
« Antwort #7 am: 08.07.08 - 10:03:41 »
Es bleiben zwei Double-Werte (rest) übrig. Diese hätte ich jetzt versucht mit evaluate("@sum(rest)") zu addieren.

john doh

  • Gast
Re: Beim einlesen von CSV-Datei Zeilen addieren
« Antwort #8 am: 08.07.08 - 10:58:15 »
Sub Initialize
   Dim uiws As New NotesUIWorkspace
   Dim session As New notessession
   Dim db As notesdatabase
   Dim fileNum As Integer
   Dim fileName As Variant
   Dim InputStr As String
   Dim FieldArray  As Variant
   Dim rest As Double
   
   
   Set db = session.currentdatabase
   fileNum% = Freefile()
   fileName = uiws.OpenFileDialog(True, "CSV-Datei auswählen", "CSV Files|*.CSV", "C:\!zeug!")
   
   Open fileName(0) For Input As fileNum%
   Line Input #1,  InputStr$
   
   Do While Not Eof(fileNum%)
      Line Input #1,  InputStr$
      
      If Instr (inputstr$,"43409699") Then
         If Instr (inputstr$,"Rechnungsbetrag") Then
            fieldarray = Replace(Right(inputstr$,10) ,";","")
            rest = Evaluate("@sum(fieldarray)")
            Call CreateDocument(db, rest)
         End If
      End If
      
   Loop
   
   Close fileNum%
End Sub

Als Ergebnis bekomme ich zwei Zeilen mit 0. Es soll aber eine Zeile mit 80,19 herauskommen. In "Fieldarray" stehen zwei Werte, 79,45 und 0,74. Wo mache ich den oder die Fehler?

Matthias
« Letzte Änderung: 08.07.08 - 12:17:09 von john doh »

Offline MadMetzger

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.052
  • Geschlecht: Männlich
  • f.k.a. Alexis Pyromanis
Re: Beim einlesen von CSV-Datei Zeilen addieren
« Antwort #9 am: 08.07.08 - 11:09:32 »
In dem Evaluate liegt der Fehler. Schau dir mal die Hilfe dazu an. Kleiner Hinweis: Erzeuge dir ein temporäres Dokument in dessen Kontext das Evaluate laufen kann. Da kannst du dann dein Field-Array als Item hinterlegen und Schwupps sollte es funken.

john doh

  • Gast
Re: Beim einlesen von CSV-Datei Zeilen addieren
« Antwort #10 am: 08.07.08 - 11:43:52 »
Erzeuge dir ein temporäres Dokument in dessen Kontext das Evaluate laufen kann. Da kannst du dann dein Field-Array als Item hinterlegen und Schwupps sollte es funken.

Ich weiß ungefähr, was Du meinst. Nur, ich hab sehr wenig Erfahrung in Script und weiß nicht wie ich das einbauen soll.

Tut mir Leid.
Matthias


Offline MadMetzger

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.052
  • Geschlecht: Männlich
  • f.k.a. Alexis Pyromanis
Re: Beim einlesen von CSV-Datei Zeilen addieren
« Antwort #11 am: 08.07.08 - 12:08:24 »
Für das temporäre Dokument:
Schau dir mal in der Designer-Help den Eintrag zu NotesDatabase und insbesondere CreateDocument an. Wenn du ein erzeugtes NotesDocument nicht speicherst verschwindet es auch von alleine wieder.

Für das Zuweisen:
Interessant ist da wahrscheinlich der Artikel in der Hilfe zu NotesDocument. Dort werden Wege gezeigt, wie man einem NotesDocument Items hinzufügen kann.

Driri

  • Gast
Re: Beim einlesen von CSV-Datei Zeilen addieren
« Antwort #12 am: 08.07.08 - 12:55:49 »
Zitat
If Instr (inputstr$,"43409699") Then
         If Instr (inputstr$,"Rechnungsbetrag") Then
            fieldarray = Replace(Right(inputstr$,10) ,";","")
            rest = Evaluate("@sum(fieldarray)")
            Call CreateDocument(db, rest)
         End If
      End If

Mit "fieldarray = ..." schießt Du in jedem Durchlauf einen anderen Stringwert in fieldarray. Du erhälst somit also nur einen Wert und nicht alle relevanten.

Das Evaluate dürfte immer 0 ergeben, weil die Formel @Sum versucht, aus einem Feld "fieldarray" die Summe zu bilden.

Was Du doch eigentlich erreichen möchtest, ist doch eine Summierung aller Beträge aus den Zeilen, die den beiden Bedingungen aus den If-Abfragen entsprechen, oder ?

Dann reicht es doch, wenn Du die Beträge jeweils aus dem String herausoperierst (möglichst noch mit Prüfung, ob es eine Zahl ist) und diese Einzelbeträge dann in einer Double-Variable aufsummierst.

In Auszügen so etwa :

Zitat
Dim ergebnis As Double
...
If Instr (inputstr$,"43409699") Then
  If Instr (inputstr$,"Rechnungsbetrag") Then
    fieldarray = Replace(Right(inputstr$,10) ,";","")
    If IsNumeric(fieldarray) Then
      ergebnis = ergebnis + CDbl(fieldarray)
    Else
      ...
    End If
...
End If
End If

Das Replace wird vermutlich nicht ausreichen, um sicherzustellen, daß Du nur eine Zahl aus dem String extrahierst. Da mußt Du noch Nachbearbeitung leisten.

Wenn der Betrag immer an der letzten Stelle steht, wäre es das Einfachste, den String per Split in einen Array zu zerlegen und das letzte Element des Array auszulesen (Stichwort UBound).
Diesen Wert kannst Du dann noch prüfen (z.B. € enthalten, IsNumeric, etc.) und erst dann summieren.
« Letzte Änderung: 08.07.08 - 13:03:55 von Driri »

john doh

  • Gast
Re: Beim einlesen von CSV-Datei Zeilen addieren
« Antwort #13 am: 08.07.08 - 13:15:46 »
Was Du doch eigentlich erreichen möchtest, ist doch eine Summierung aller Beträge aus den Zeilen, die den beiden Bedingungen aus den If-Abfragen entsprechen, oder ?

Ja, genau so!

Das Ergebnis, mit Deiner Ergänzung, sieht so aus
79,45
80,19
Er soll mir aber nur ein Document erzeugen, mit der Summe der Beträge.

Matthias

Driri

  • Gast
Re: Beim einlesen von CSV-Datei Zeilen addieren
« Antwort #14 am: 08.07.08 - 13:36:50 »
Mein Code oben "repariert" auch nur deinen geposteten Code. Der letzte Absatz in meinem Posting weist Dir den Weg.


Edit : Das CreateDocument mußt Du nach der Do-Schleife einbauen. Innerhalb der Schleife kann sich der Wert ja ändern und somit würde für jeden Zwischenwert ein Ergebnisdokument erzeugt.
« Letzte Änderung: 08.07.08 - 13:38:23 von Driri »

john doh

  • Gast
Re: Beim einlesen von CSV-Datei Zeilen addieren
« Antwort #15 am: 08.07.08 - 14:26:29 »
@Driri
@Bernhard

Klappt wunderbar! Besten Dank!
« Letzte Änderung: 08.07.08 - 14:28:51 von john doh »

john doh

  • Gast
Re: Beim einlesen von CSV-Datei Zeilen addieren
« Antwort #16 am: 10.07.08 - 09:26:47 »
Hallo Zusammen,

ich muss den Thread leider wiederbeleben. Folgender Sachverhalt.
Infos zur CSV-Datei:
- kommt jeden Monat neu und kann im Aufbau und Formatierung nicht geändert werden
- enthält mehrere Kartennr, zu jeder gibt es ca. 25 Zeilen
- jede dieser Zeile enthält die Kartennr, einen Eurobetrag und einige das Wort "Rechnungsbetrag"

Infos zur DB:
- enthält Kartenr, die nur einmal vorkommen

Aufgabe des Agenten:
- gucken, ob die Kartennr in der CSV, auch in der DB auftaucht
- wenn ja, sollen die jeweiligen Eurobeträge (die nicht an der gleichen stelle Stehen) der Zeilen mit "Rechnungsbetrag" addiert und der entsprechenden Kartennr zugeordnet werden

Das ist der Agent:
Sub Initialize
   Dim uiws As New NotesUIWorkspace
   Dim session As New notessession
   Dim db As notesdatabase
   Dim doc As notesdocument
   Dim view As NotesView
   Dim filenr As Integer
   Dim filename As Variant
   Dim inputstr As String
   Dim delimiter As String
   Dim array  As Variant
   Dim euroarray As Variant
   Dim eurobtr As Double
   
   Set db = session.currentdatabase
   Set view = db.GetView ("abgleich")
   filenr% = Freefile()
   filename = uiws.OpenFileDialog(True, "CSV-Datei auswählen", "CSV Files|*.CSV", "C:\!zeug!")
   delimiter = ";"
   
   Open filename(0) For Input As filenr%
   Line Input #1,  inputstr$
   
   Do While Not Eof(filenr%)
      Line Input #1,  inputstr$
      array = Split(Replace(inputstr$ ,Chr(34),""),delimiter)
      euroarray = Replace(Right(inputstr$,10) ,";","")
      
      If  Not Isempty(array) Then
         If Instr(inputstr$,"Rechnungsbetrag") Then
            
            Set doc = view.GetDocumentByKey(array(2))
            If  Not doc Is Nothing Then
               eurobtr = eurobtr + Cdbl(euroarray)      
               Call doc.ReplaceItemValue("euros", eurobtr)
               Call doc.Save(True,True)
            End If
         End If
      End If
      
   Loop
   
   Close filenr%
End Sub

Die Ansicht nach dem Ausführen des Agenten:
03747706  11,17
16049486  24,14
24910325  74,17
43409699  154,36
55423754  203,82

So sollte sie aber aussehen:
03747706  11,17
16049486  12,97
24910325  50,03
43409699  80,19
55423754  49,46

Zu der Kartennr 43409699 gibt es zwei Zeilen mit "Rechnugsbetrag". Die erste enthält den Eurobetrag 79,45, die zweite 0,74, macht zusammen 80,19.

Wie muss der Code aussehen, um das gewünschte Ergebnis zu erhalten?

Matthias
« Letzte Änderung: 10.07.08 - 09:54:05 von john doh »

Offline Thomas Schulte

  • @Notes Preisträger
  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 4.388
  • Geschlecht: Männlich
  • Ich glaub mich tritt ein Pferd
Re: Beim einlesen von CSV-Datei Zeilen addieren
« Antwort #17 am: 10.07.08 - 09:37:20 »
Es tut mir leid wenn ich jetzt gar garstig klinge.

Kauf dir jemanden ein der dir die Lösung schreibt.

Und dann noch jemand der dich ausbildet.

Oder am besten beides.
Thomas Schulte

Collaborative Project Portfolio and Project Management Software

"Aber wo wir jetzt einmal soweit gekommen sind, möchte ich noch nicht aufgeben. Versteh mich recht, aufgeben liegt mir irgendwie nicht."

J.R.R.Tolkien Herr der Ringe, Der Schicksalsberg

OpenNTF Project: !!HELP!! !!SYSTEM!!  !!DRIVER!!

Skype: thomasschulte-kulmbach

Driri

  • Gast
Re: Beim einlesen von CSV-Datei Zeilen addieren
« Antwort #18 am: 10.07.08 - 09:38:51 »
Full ACK. Zumal Du meinen Hinweis, wie Du den Betrag am sinnvollsten ermittelst, nicht gelesen oder nicht verstanden hast. In euroarray kann u.U. so alles mögliche drinstehen.

john doh

  • Gast
Re: Beim einlesen von CSV-Datei Zeilen addieren
« Antwort #19 am: 10.07.08 - 10:10:25 »
@ Driri
Tschuldigung, hatte vergessen zu erwähnen, dass die Eurobeträge nicht an der gleichen Stelle stehen. Und ich habe Deinen Hinweis gelesen, Die Beträge, die er mir ermittelt sind alle richtig. Nur er bildet mir die Summe mit allen Kartennr und nicht für jede einzeln.

@Thomas Schulte
Tut mir leid, wenn ich mich blöd anstelle, aber das sind meine ersten Gehversuche in Lotus Script. Ich hab es mir nicht ausgesucht. Ich tue das alles auf Bitten meines Chefs. Da ich auch noch was anderes zutun habe,als mich den ganzen Tag mit Script zubeschäftigen und mir keine wirklich gute deutschsprachige Dokumentation zum Thema Script bekannt ist, dachte ich mir "Wende ich mich mal ans Furom, vielleicht können die mir helfen.".

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz