| |
VB.NET - Ein- und UmsteigerCSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Vegas85 | Datum: 15.09.15 00:02 |
| Bin noch blutiger Anfänger da ich momentan mehr bastele als ich verstehe, muss ich nun mal Fachleute fragen.
Folgendes ich habe eine CSV mit 15 spalten und 18648 zeilen, diese würde ich gerne durchsuchen nach einem bestimmtem Wort.
Dann in der Zeile wo das Wort gefunden wurde, sollte die komplette spalte in einer box wiedergegeben werden.
Beispiel:
Das;ist;ein;gutes;forum;test
Hallo;Welt;schönes;wetter;heute;test
Ich;bin;ein;test;123;
Nun soll mein Programm z.b nach dem Wort test suchen und mir dann die erste spalte wo test in der Zeile vorkommt in einer textbox oder richtextbox oder ListView ausgeben was dafür am besten geeignet ist.
Da die CSV 18648 Zeilen hat würde ich gerne das auf 300 Zeilen begrenzen, so das immer nach 300 zeilen eine neuen csv gespeichert wird und danach die nächsten 300 abgearbeitet werden bis die 18648 zeilen komplett fertig sind.
Ist das Möglich? Wenn ja, wie?
Viele Grüße
Hier noch mein Aktueller stand leider komm ich nicht weiter.
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) _
Handles Button1.Click
Dim file_open As New OpenFileDialog
file_open.Filter = "csv-dateien|*.csv"
file_open.AddExtension = True
If file_open.ShowDialog = Windows.Forms.DialogResult.OK Then
Dim auswahlListe As New List(Of String)
For Each zeile As String In IO.File.ReadAllLines(file_open.FileName)
If zeile.Contains("in stock") Then
auswahlListe.Add(zeile)
End If
Next
RichTextBox1.Text = (String.Join(vbNewLine, auswahlListe.ToArray))
End If
End Sub | |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Manfred X | Datum: 15.09.15 18:12 |
| Hallo!
Probier mal diese Variante ....
Private Sub btn_Click(sender As System.Object, e As System.EventArgs) _
Handles btn.Click
Const linesperfile As Integer = 300 'max. Zeilen pro Ausgabedatei
Dim filecounter As Integer = 0
Dim linecounter As Integer = 0
Dim filename As String = "C:\daten\outx" 'Ausgabedatei(en)
Dim file_open As New OpenFileDialog
file_open.Filter = "csv-dateien|*.csv"
file_open.AddExtension = True
Dim sr As IO.StreamWriter = Nothing
If file_open.ShowDialog = Windows.Forms.DialogResult.OK Then
Dim auswahlListe As New List(Of String)
For Each zeile As String In IO.File.ReadAllLines(file_open.FileName)
Dim fields As New List(Of String)(zeile.Split(";"c))
If fields.Contains("in stock") Then
If linecounter = 0 Then
filecounter += 1
sr = New IO.StreamWriter(filename & "00" & _
filecounter.ToString & ".csv")
End If
sr.WriteLine(zeile)
linecounter += 1
If linecounter = linesperfile Then
sr.Close()
linecounter = 0
End If
End If
Next zeile
sr.Close()
End If
End Sub | |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Vegas85 | Datum: 15.09.15 21:29 |
| Vielen Dank funktioniert sehr gut
Noch eine frage dazu wie kann ich nun es so machen das nur spalte 3 und 5 gespeichert werden ?
| |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Manfred X | Datum: 15.09.15 21:36 |
| Hallo!
Durch die Split-Methode wird die gelesene Zeile
in eine null-basierte Liste von Feldern aufgeteilt.
Statt: sr.writeline(zeile)
jetzt: sr.writeline(fields(2) & ";" & fields(4))
| |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Vegas85 | Datum: 15.09.15 21:50 |
| Perfekt
Eins noch dann habe ist es so wie ich es wollte.
Kann mann die daten auch erst erstellen wenn ich auf einen zweiten button klicke ?
Also einen zum öffnen und einem zum speichern.
Und ich würde gerne bevor die spalten gespeichert werden sie nocheinmal in einer richtextbox mir ansehen können. | |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Manfred X | Datum: 15.09.15 21:56 |
| Klar geht das.
Erstelle auf Formularebene (außerhalb von Subs/Functions) eine Stringvariable:
Private Filename_In as string
Dort wird der Dateiname gespeichert, der von OpenFileDialog
nach Benutzerauswahl zurückgegeben worden ist.
Im Click-Event des Speichern-Buttons wird dann die dort zugewiesene Zeichenfolge
verwendet, um die Datei zu öffnen und die Daten zu lesen.
| |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Vegas85 | Datum: 15.09.15 22:22 |
| So ?
Public Class Form1
Private Filename_in As String
Private Sub btn_Click(sender As System.Object, e As System.EventArgs) _
Handles btn.Click
Const linesperfile As Integer = 300 'max. Zeilen pro Ausgabedatei
Dim filecounter As Integer = 0
Dim linecounter As Integer = 0
'Dim filename As String = "C:\Users\xxx\Documents\test" 'Ausgabedatei( _
en)
Dim file_open As New OpenFileDialog
file_open.Filter = "csv-dateien|*.csv"
file_open.AddExtension = True
Dim sr As IO.StreamWriter = Nothing
If file_open.ShowDialog = Windows.Forms.DialogResult.OK Then
Dim auswahlListe As New List(Of String)
For Each zeile As String In IO.File.ReadAllLines(file_open.FileName)
Dim fields As New List(Of String)(zeile.Split(";"c))
If fields.Contains("in stock") Then
If linecounter = 0 Then
filecounter += 1
sr = New IO.StreamWriter(Filename_in & "00" & _
filecounter.ToString & ".csv")
End If
sr.WriteLine(fields(2) & ";" & fields(7))
linecounter += 1
If linecounter = linesperfile Then
sr.Close()
linecounter = 0
End If
End If
Next zeile
sr.Close()
End If
End Sub
Private Sub save_Click(sender As System.Object, e As System.EventArgs) _
Handles save.Click
IO.File.ReadAllLines(Filename_in)
End Sub
End Class | |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Manfred X | Datum: 15.09.15 22:38 |
| Eher wohl so ....
(Im Beispiel werden alle Controls NICHT im Designer, sondern per Code erstellt!)
Public Class frmCSV
Dim WithEvents btn_In As New Button _
With {.Parent = Me, .Text = "CSV-IN"}
Dim WithEvents btn_out As New Button _
With {.Parent = Me, .Text = "CSV_out", .Left = 150}
Dim ofd As New OpenFileDialog
Dim tbo As New TextBox With _
{.Parent = Me, .Top = 50, .Width = 400, .Height = 400, _
.Multiline = True}
Dim FileName_In As String = ""
Private Sub frmCSV_Load(sender As System.Object, _
e As System.EventArgs) Handles MyBase.Load
Me.Width = 420 : Me.Height = 500
End Sub
Private Sub btn_In_Click(sender As Object, _
e As System.EventArgs) Handles btn_In.Click
'Eingabedatei abfragen
With ofd
.Filter = "CSV|*csv"
.CheckFileExists = True
.Multiselect = False
If .ShowDialog = _
Windows.Forms.DialogResult.OK Then FileName_In = .FileName
'Eingabedatei: Inhalt anzeigen
tbo.Text = IO.File.ReadAllText(.FileName)
End With
End Sub
Private Sub btn_out_Click(sender As Object, _
e As System.EventArgs) Handles btn_out.Click
'Statt Konstanten könnten Dialogeingaben verwendet werden
Const linesperfile As Integer = 300 'max. Zeilen pro Ausgabedatei
Const filename As String = "C:\daten\outx" 'Ausgabedatei(en)
Const Searchstring As String = "in stock"
Dim filecounter As Integer = 0
Dim linecounter As Integer = 0
Dim sr As IO.StreamWriter = Nothing
If IO.File.Exists(FileName_In) Then
For Each zeile As String In IO.File.ReadAllLines(FileName_In)
Dim fields As New List(Of String)(zeile.Split(";"c))
If fields.Contains(Searchstring) Then
If linecounter = 0 Then
filecounter += 1
sr = New IO.StreamWriter(filename & "00" & _
filecounter.ToString & ".csv")
End If
If fields.Count >= 5 Then
sr.WriteLine(fields(2) & ";" & fields(4))
linecounter += 1
If linecounter = linesperfile Then
sr.Close()
linecounter = 0
End If
End If
End If
Next zeile
sr.Close()
End If
End Sub
End Class
Beitrag wurde zuletzt am 15.09.15 um 22:43:43 editiert. | |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Vegas85 | Datum: 15.09.15 23:01 |
| Danke so klappt es
Hatte da ja komplett was falsches gemacht
Muss nun nur noch bei der textbox anstatt tbo.Text = IO.File.ReadAllText(.FileName),
es hinbekommen das er mit die fields(2) & ";" & fields(4)) anzeigt. | |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Manfred X | Datum: 15.09.15 23:13 |
| Das geht genau so, wie ich es bereits für die Ausgabe gemacht habe.
Zeilen mit Readalllines lesen,
In einer Schleife jede zeile mit Split in eine Fields-Liste zerlegen
- falls mindestens 5 felder vorhanden sind
--- die gewünschten Felder per Index anzeigen (AppendText-Methode der Textbox)
Beitrag wurde zuletzt am 15.09.15 um 23:14:11 editiert. | |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Vegas85 | Datum: 15.09.15 23:48 |
| So habe es mal ein wenig angepasst.
Public Class frmCSV
Dim ofd As New OpenFileDialog
Dim FileName_In As String = ""
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) _
Handles Button1.Click
'Eingabedatei abfragen
With ofd
.Filter = "CSV|*csv"
.CheckFileExists = True
.Multiselect = False
If .ShowDialog = Windows.Forms.DialogResult.OK Then FileName_In = _
.FileName
Const linesperfile As Integer = 300 'max. Zeilen pro Ausgabedatei
Dim filename As String = SaveFileDialog1.FileName 'Ausgabedatei(en)
Const Searchstring As String = "in stock"
Dim filecounter As Integer = 0
Dim linecounter As Integer = 0
Dim sr As IO.StreamWriter = Nothing
If IO.File.Exists(FileName_In) Then
For Each zeile As String In IO.File.ReadAllLines(FileName_In)
Dim fields As New List(Of String)(zeile.Split(";"c))
If fields.Contains(Searchstring) Then
If linecounter = 0 Then
filecounter += 1
sr = New IO.StreamWriter("00" & _
filecounter.ToString & SaveFileDialog1.FileName)
End If
If fields.Count >= 5 Then
RichTextBox1.Text = (fields(9))
RichTextBox2.Text = (fields(11))
linecounter += 1
If linecounter = linesperfile Then
sr.Close()
linecounter = 0
End If
End If
End If
Next zeile
sr.Close()
End If
End With
End Sub
Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) _
Handles Button2.Click
SaveFileDialog1.Filter = "CSV Files (*.csv)|*.csv"
If SaveFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
'Statt Konstanten könnten Dialogeingaben verwendet werden
Const linesperfile As Integer = 300 'max. Zeilen pro Ausgabedatei
Dim filename As String = SaveFileDialog1.FileName 'Ausgabedatei(en)
Const Searchstring As String = "in stock"
Dim filecounter As Integer = 0
Dim linecounter As Integer = 0
Dim sr As IO.StreamWriter = Nothing
If IO.File.Exists(FileName_In) Then
For Each zeile As String In IO.File.ReadAllLines(FileName_In)
Dim fields As New List(Of String)(zeile.Split(";"c))
If fields.Contains(Searchstring) Then
If linecounter = 0 Then
filecounter += 1
sr = New IO.StreamWriter("00" & _
filecounter.ToString & SaveFileDialog1.FileName)
End If
If fields.Count >= 5 Then
sr.WriteLine(fields(9) & ";" & fields(11))
linecounter += 1
If linecounter = linesperfile Then
sr.Close()
linecounter = 0
End If
End If
End If
Next zeile
sr.Close()
End If
End If
End Sub
End Class So weit funktioniert es nun wie ich das möchte nur wird in den boxen immer nur eine zeile angezeigt anstatt den 300 und beim speichern bekomme ich einen fehler
sr = New IO.StreamWriter("00" & filecounter.ToString & _
SaveFileDialog1.FileName) Das angegebene Pfadformat wird nicht unterstützt. | |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Manfred X | Datum: 16.09.15 00:08 |
| Du mußt die Namen der AusgabefileSerie richtig zusammen bauen:
Pfad+Filename_ohne_Erweiterung + Kennziffer_als_String + File-Erweiterung
Etwa so:
savefiledialog.filename.substring(0, savefiledialog.filename.length - 4) _
& "00" & filecounter.tostring & ".csv"
Beim Eingabe-Button benötigst Du den StreamWriter und den Writebefehl nicht!
Dort soll doch noch nichts ausgegeben werden.
Was Du damit meinst "nur eine Zeile anzeigen" verstehe ich nicht.
Du mußt die Werte in der Richtextbox jeweils anhängen, nicht einfach zuweisen.
Beitrag wurde zuletzt am 16.09.15 um 00:14:28 editiert. | |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Vegas85 | Datum: 16.09.15 12:16 |
| Das meinte ich mit der Zeile bei der ausgabe wird nur eine Zeile angezeigt aber ich hätte gerne das alle angezeigt werden bzw. die 300 bevor sie abgespeichert werden.
Beitrag wurde zuletzt am 16.09.15 um 12:17:08 editiert. | |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Manfred X | Datum: 16.09.15 14:53 |
| Willst Du für die Anzeige eine Blätter-Funktion???
Statt dessen wäre vielleicht ein gebundenes DatagridView geeignet:
(Der Filterstring wird vor dem Laden in die Textbox eingetragen.)
Public Class frmCSV
Dim WithEvents btn_In As New Button With _
{.Parent = Me, .Text = "CSV-IN"}
Dim WithEvents btn_out As New Button With _
{.Parent = Me, .Text = "CSV_out", .Left = 150}
Dim ofd As New OpenFileDialog, sfd As New SaveFileDialog
Dim tboFilter As New TextBox With _
{.Parent = Me, .Top = 50, .Width = 400}
Dim dt As New DataTable, bs As New BindingSource
Dim dgv As New DataGridView With {.Parent = Me, _
.Top = 100, .Width = 400, .Height = 400, _
.AllowUserToAddRows = False, .DataSource = bs}
Dim FileName_In As String = "", filename_out As String = ""
Private Sub frmCSV_Load(sender As System.Object, _
e As System.EventArgs) Handles MyBase.Load
Me.Width = 420 : Me.Height = 550
dt.Columns.Add("Spalte3") : dt.Columns.Add("Spalte5")
End Sub
Private Sub btn_In_Click(sender As Object, _
e As System.EventArgs) Handles btn_In.Click
With ofd
.Filter = "CSV|*csv"
.CheckFileExists = True
.Multiselect = False
If .ShowDialog = _
Windows.Forms.DialogResult.Cancel Then Exit Sub
FileName_In = .FileName
bs.DataSource = Nothing
dt.Rows.Clear()
Dim lines() As String = IO.File.ReadAllLines(.FileName)
For i As Integer = 0 To lines.Length - 1
Dim fields As New List(Of String)(lines(i).Split(";"c))
If String.IsNullOrEmpty(tboFilter.Text) OrElse _
fields.Contains(tboFilter.Text) Then
If fields.Count >= 5 Then
dt.Rows.Add(fields(2), fields(4))
End If
End If
Next i
bs.DataSource = dt
End With
End Sub
Private Sub btn_out_Click(sender As Object, _
e As System.EventArgs) Handles btn_out.Click
Const linesperfile As Integer = 300 'max. Zeilen/Ausgabedatei
Dim filecounter As Integer = 0
Dim linecounter As Integer = 0
Dim toOpen As Boolean = True
With sfd
.Filter = "CSV|*.csv"
.DefaultExt = ".csv"
If .ShowDialog = Windows.Forms.DialogResult.Cancel Then Exit Sub
filename_out = .FileName.Substring(0, .FileName.Length - 4)
End With
Dim sr As IO.StreamWriter = Nothing
If IO.File.Exists(FileName_In) Then
For Each zeile As String In IO.File.ReadAllLines(FileName_In)
Dim fields As New List(Of String)(zeile.Split(";"c))
If String.IsNullOrEmpty(tboFilter.Text) OrElse _
fields.Contains(tboFilter.Text) Then
If toOpen Then
filecounter += 1
sr = New IO.StreamWriter(filename_out & "_" & _
filecounter.ToString & ".csv")
toOpen = False
End If
If fields.Count >= 5 Then
sr.WriteLine(fields(2) & ";" & fields(4))
linecounter += 1
If linecounter = linesperfile Then
sr.Close()
linecounter = 0
toopen = True
End If
End If
End If
Next zeile
sr.Close()
End If
End Sub
End Class
Beitrag wurde zuletzt am 16.09.15 um 15:09:30 editiert. | |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Vegas85 | Datum: 16.09.15 16:38 |
| Vielen Dank für deine Hilfe.
Hast mich echt sehr weit gebracht.
Dennoch hätte ich gerne die anzeige in einer richtextbox das mit der dgv ist sehr gut gemacht aber nicht so wie ich es gebrauchen könnte. | |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Manfred X | Datum: 16.09.15 17:02 |
| Hallo!
Da ich Deine Zielsetzung nicht kenne, kann ich nur allgemein verwendbare Vorschläge machen.
Wenn Du die Spalten aus den gefilterten Zeilen in eine/mehrere Richtextbox(en) eintragen
willst, muß Du - wie erwähnt - in der Leseschleife die AppendText-Methode nutzen:
Statt
dt.Rows.Add(fields(2), fields(4))
dann etwa so
richtextbox1.AppendText(fields(2) & Microsoft.VisualBasic.vbCrLf)
richtextbox2.appendtext(fields(4) & Microsoft.VisualBasic.vbcrlf)
Vor der Schleife die Richtextboxen ausleeren (Clear).
| |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Vegas85 | Datum: 16.09.15 17:28 |
| Danke Danke nun ist es perfekt
Ich danke dir auch für deine Allgemeine vorschläge sind auch sehr gut.
Nur hatte ich das doch mir anders vorgestellt.
Aber dennoch vielen Dank für deine Hilfe und Gedult | |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Vegas85 | Datum: 19.09.15 22:20 |
| Hi
Ich hatte da noch eine Frage und möchte dafür nicht extra ein Thema aufmachen.
Also ich würde nun gerne noch eine Funktion in mein Tool mit einbauen.
Ich weiß ja nun wie ich eine csv durchsuchen kann.
Ich durchsuchen eine csv nach dem Wort test in den Zeilen wo das Wort nun vorkommt lasse ich mir ja dann anschließend die Spalte 3 in einer richtextbox anzeigen.
So nun würde ich gerne mit diesem Ergebniss wo in meiner richtextbox steht eine andere csv durchsuchen und wieder die Spalte 1 anzeigen lassen.
Denn das blöde ist Ich habe zwei verschiedene csv Dateien und muss da bestimmte Spalten mir raus nehmen und mir davon eine neue csv erstellen.
Wie könnte ich das am besten umsetzten? | |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Manfred X | Datum: 20.09.15 15:49 |
| [I]So nun würde ich gerne mit diesem Ergebnis, das in meiner richtextbox steht
eine andere csv durchsuchen und wieder die Spalte 1 anzeigen lassen.
Ich habe zwei verschiedene csv Dateien und muss da bestimmte Spalten raus nehmen
und daraus eine neue csv erstellen.[/I]
Das sind ungenaue Angaben.
Auf welche Weise soll das Ergebnis einer Suche (=eine Liste von Zeilen bzw. Begriffen)
für die Suche in einer anderen Datei benutzt werden?
Soll eine ODER-Suche durchgeführt werden, d.h. Zeilen werden gesucht,
die mindestens einen Begriff aus einer Liste von Begriffen enthalten?
In welchen Spalten soll gesucht werden? In allen oder einer Teilmenge?
Welche Spalten sollen in einer neuen Datei ausgegeben werden?
| |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Vegas85 | Datum: 20.09.15 17:14 |
| Okay also versuche es mal genauer zu erklären:
Auf dem ersten Bild ist die erste csv die ich laden möchte und da brauche ich die Spalte K mit dem Wort out of stock nun möchte ich alle Zeilen kopieren wo das Wort out of stock vor kommt aber nur die Spalte C
Mit der Spalte C aus der ersten csv sollte nun in der zweiten csv die Spalte N mit der aus der ersten csv kopierten Spalte C verglichen werden stimmen diese überein soll anschließend Spalte A kopiert werden.
Mit der Spalte A soll nun die Fertige csv erstellt werden.
Also das Ergebnis soll in Spalte B stehen dazu müsste noch automatisch
Spalte A mit dem Wert End und
Spalte C mit dem Wert NotAvailable gefüllt werden, dem entsprechen wie lang die vorher Eingefügten Zeilen sind.
Ich hatte hier jetzt im Beispiel 6 Zeilen genutzt es können aber auch mehr oder weniger sein.
Die erste csv hatt eine Zeile Länge von über 18000.
Hoffe nun das es so verständlich ist was ich genau vor habe
Beitrag wurde zuletzt am 20.09.15 um 17:32:27 editiert. | |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Manfred X | Datum: 20.09.15 18:16 |
| So weit ich sehe, hast Du zwei miteinander verknüpfte Tabellen.
Durch welche Spalte(n) wird diese Beziehung definiert.
Steht in beiden Tabellen z.B. eine (eindeutige) Artikelnummer?
Oder bildet die Spaltenpaarung Artikelbezeichnung/Titel eine
eindeutige Verknüpfung? Das wäre eher unüblich.
Ich habe den Eindruck, der Datentyp der ID-Spalte in der ersten Tabelle
ist nicht korrekt definiert worden.
Normalerweise lädt man so eine Struktur in ein Dataset (2 Tabellen)
und definiert eine entsprechende Datarelation.
(Oder man macht ein Join der Tabellen.)
Dazu lassen sich Satz-Auswahlen erstellen.
Beitrag wurde zuletzt am 20.09.15 um 18:24:17 editiert. | |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Vegas85 | Datum: 20.09.15 18:40 |
| Nein sind zwei unterschiedliche CSV Dateien von zwei verschiedenen Programmen. Die bekomme ich so wie sie sind ausgegeben.
Möchte halt nur aus den zwei CSV Dateien mir diese Teile raus suchen und zu meiner CSV erstellen wie ich sie brauche.
Ist auch nicht mit einander Verknüpf oder so | |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Manfred X | Datum: 20.09.15 18:53 |
| Aber Du operierst mit einer Beziehung zwischen Spalte C
in der ersten csv und Spalte N in der zweiten csv.
Und wie diese Beziehung beschaffen ist, wäre zu klären.
Daraus ergibt sich die Art des durchzuführenden Vergleichs, d.h.
wie soll die Liste (Suchergebnisse zu Spalte C) aus der ersten csv
auf die Spalte N der Zeilen in der zweiten csv bezogen werden?
| |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Vegas85 | Datum: 20.09.15 19:16 |
| 1 zu 1 es soll ja aus der ersten csv die spalte c gespeichert werden und anschließend in der zweiten csv danach gesucht/verglichen werden. Wurde diese gefunden dann spalte a aus der zweiten csv in einer neuen datei ausgeben. | |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Manfred X | Datum: 20.09.15 19:28 |
| Wenn die Spaltenpaarung Titel/Artikelbezeichnung eindeutig ist
(d.h. gleiche Schreibweise, durchgehend exakt eine Bezeichnung
für je einen Artikel) kannst Du eine Datarelation definieren und
zu den gefundenen Zeilen in der ersten Datatable die zugehörigen
Childrow(s) aus der zweiten Datatable benutzen, um die Ausgabezeilen
in einer dritten Tabelle aus den benötigten Spalten aufzubauen.
Beispiel
| |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Vegas85 | Datum: 20.09.15 19:33 |
| Okay Danke
Nur mit dem Beispiel weiß ich grad nicht wie ich das auf mein projekt anwenden kann. | |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Manfred X | Datum: 20.09.15 20:00 |
| CSV-Editor zum Laden einer CSV-Datei.
Zwei Instanzen dieser Klasse benutzen, jeweils einen Tabellennamen angeben
und die beiden Tables in ein Dataset einfügen.
| |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Vegas85 | Datum: 20.09.15 20:32 |
| Würde das auch einfacher gehen?
Kann man da nicht den Code anwenden der hier schon vorhanden ist? | |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Manfred X | Datum: 20.09.15 21:20 |
| Noch einfacher kriege ich das leidfer nicht hin ....
Die Spaltenindices in den Spaltenbez. müssen angepaßt werden.
Public Class frmCSV2
Dim ds As New DataSet
Dim dt1, dt2, dtout As cDataTableCSV
Private Function LoadCSV(file As String) As cDataTableCSV
'CSV Datei laden - ggf. Schlüssel festlegen
Dim dt As New cDataTableCSV
dt.TableName = IO.Path.GetFileNameWithoutExtension(file)
If Not dt.LoadFile(file, System.Text.Encoding.Default) Then Return _
Nothing
'dt.PrimaryKey = New DataColumn() {dt.Columns(0)}
Return dt
End Function
Private Sub frmCSV2_Load(sender As System.Object, _
e As System.EventArgs) Handles MyBase.Load
'CSV-Files lesen
ds.Tables.Add(LoadCSV("C:\daten\csv1.csv"))
ds.Tables.Add(LoadCSV("C:\daten\csv2.csv"))
'Datarelation definieren
Dim dr As New DataRelation _
("Artikel", ds.Tables(0).Columns(0), ds.Tables(1).Columns(0))
ds.Relations.Add(dr)
'Spalten in Ausgabedatei erstellen
dtout = New cDataTableCSV
dtout.Columns.Add("SP_0") : dtout.Columns.Add("SP_1")
'Schleife über csv1-Zeilen (=Parent)
For Each prow As DataRow In ds.Tables(0).Rows
'Auswahlkriterium in csv1 beachten
If DirectCast(prow("SP_0"), String) = "2" Then
'per Relation zugeordnete Childrow in csv2
For Each crow As DataRow In prow.GetChildRows(dr)
'Ausgabedatensatz aufbauen
Dim orow As DataRow = dtout.NewRow
orow("SP_0") = prow("SP_0")
orow("SP_1") = crow("SP_0")
dtout.Rows.Add(orow)
Next crow
End If
Next prow
'Zeilen als Datei ausgeben
dtout.SaveFile("C:\daten\csv_out.csv", ";"c)
End Sub
End Class | |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Vegas85 | Datum: 20.09.15 21:40 |
|
Bei
'CSV-Files lesen
ds.Tables.Add(LoadCSV("C:\Users\xxx\Desktop\csv\csv1.csv"))
Bekomm ich den Fehler:
'table'-Argument darf nicht null sein.
Parametername: table | |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Manfred X | Datum: 20.09.15 21:46 |
| Dann konnte die angegebene Datei nicht gelesen werden.
Setze im Code der cDataTableCSV-Klasse geeignete Brechpunkte
und stelle fest, warum "nothing" zurück gegeben wird.
| |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Vegas85 | Datum: 20.09.15 22:00 |
| Noch ein fehler Der Typ "cDataTableCSV" ist nicht definiert.
Was meinst du mit "Die Spaltenindices in den Spaltenbez. müssen angepaßt werden" ? | |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Manfred X | Datum: 20.09.15 22:05 |
| Du mußt die von mir verlinkte CSV-Editor Klasse in das Projekt
aufnehmen: "Klasse hinzufügen" und den gesamten Code aus dem
Forenbeitrag reinkopieren.
Setze "Option Strict On" ein.
Die Beteiligung an diesem Forum setzt gewisse Grundkenntnisse in VB voraus!!!
| |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Vegas85 | Datum: 20.09.15 22:17 |
| Okay wie am anfang gesagt bin ich noch blutiger Anfänger da ich momentan mehr bastele als ich verstehe.
Option Strict On habe ich schon so in vb einstellt das immer On ist
Ich hatte das schon so gemacht wollte nur wissen obs auch so richtig ist das ich mir nicht sicher war.
Versteh halt grade nicht was du damit meinst
"Die Spaltenindices in den Spaltenbez. müssen angepaßt werden"
Beitrag wurde zuletzt am 20.09.15 um 22:21:18 editiert. | |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Manfred X | Datum: 20.09.15 22:30 |
| "blutiger Anfänger" gilt nicht.
Man muß ein Lehrbuch sorgfältig durchgearbeitet haben
Die CSV-Spalten werden beim Laden in die Table automatisch benannt
als SP_0, SP_1, usw.
Überall wo ich zur Demonstration SP_0, SP_1 usw geschrieben habe,
mußt Du die Indices angeben, die sich tatsächlich auf die
null-basierten Positionen Deiner jeweils benötigten Dateispalten beziehen.
| |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Vegas85 | Datum: 20.09.15 22:42 |
| Manfred X schrieb:
Zitat: | | "blutiger Anfänger" gilt nicht.
Man muß ein Lehrbuch sorgfältig durchgearbeitet haben
| |
https://www.rheinwerk-verlag.de/einstieg-in-visual-basic-2015_3813/
Ist wäre das geeignet für den Anfang ? Denn das habe ich mir vorbestellt nur muss ich warten bis es erscheint.
Achso den fehler mit dem dateien laden habe ich gelöst bekommen.
Beitrag wurde zuletzt am 20.09.15 um 22:50:53 editiert. | |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Vegas85 | Datum: 20.09.15 23:03 |
| Achso okay werde ich mir mal anschauen.
nun anderes problem. habe die anderen SP_ angepasst
'Datarelation definieren
Dim dr As New DataRelation _
("Artikel", ds.Tables(0).Columns(0), ds.Tables(1).Columns(0))
ds.Relations.Add(dr) <-- Diese Spalten haben momentan keine eindeutigen Werte. | |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Manfred X | Datum: 20.09.15 23:10 |
| Das hatte ich erwartet.
Eine 1:N (1:1) Relation setzt voraus, daß
- die Titel (Artikel) in csv1 (Parent) eindeutig sind (keine Mehrfacheinträge)
- daß zu jedem Eintrag (Artikelbez.) in csv2 (Child) ein entsprechender Wert
in csv1 gefunden wird.
Hilfsweise kannst Du in der Datarelation noch ein "false" für den Parameter
"createconstraints" angeben. Aber dann existiert keine Eindeutigkeit in der Beziehung!
Vermutlich mußt Du den Inhalt dieser Tabellen-Spalten geeignet überarbeiten
oder Du besorgst Dir eine csv1, die eine Spalte mit den gleichen Artikelnummern
enthält wie die csv2.
| |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Vegas85 | Datum: 20.09.15 23:28 |
| Manfred X schrieb:
Zitat: | |
Vermutlich mußt Du den Inhalt dieser Tabellen-Spalten
geeignet überarbeiten
oder Du besorgst Dir eine csv1, die eine Spalte mit den
gleichen Artikelnummern
enthält wie die csv2.
| |
Aber die sind doch gleich wenn ich nun z.b aus csv2 mir ein Artikelbezeichnung kopiere und per strg+f in der csv1 suche dann findet er genau den gleichen text
Könnte man das nicht so machen das einfach in der csv 1 nach dem wort "out of stock" gesucht wird und dann die Spalte 2 kopiert und in csv 2 dann nach der kopierten spalte 2 gesucht wird ?
Beitrag wurde zuletzt am 20.09.15 um 23:31:56 editiert. | |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Manfred X | Datum: 20.09.15 23:40 |
| Vetraue der Relation.
Wenn Du die richtigen Spalten kombinierst und diese Zuordnung eindeutig ist,
gibt es auch keine Fehlermeldung!!
Schau Dir Deine Datei mal genauer an.
Es liegen vermutlich in manchen Fällen unterschiedliche Schreibweisen,
Abkürzungen o.ä. vor.
Zur Not kannst Du den createconstraints-Parameter beim Erstellen
der DataRelation nutzen.
| |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Vegas85 | Datum: 20.09.15 23:43 |
| Habe schon den fehler gefunden.
In csv1 steht es z.b so Busch 48600 MB A-Klasse Classic
In cvv2 steht es z.b so "Busch 48600 MB A-Klasse Classic"
Woher weiß der Code das er nur die Daten mit "out of Stock" suchen soll ?
Beitrag wurde zuletzt am 20.09.15 um 23:47:18 editiert. | |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Manfred X | Datum: 21.09.15 00:01 |
| Du mußt hier die richtigen Spaltenindices angeben:
'Datarelation definieren
Dim dr As New DataRelation _
("Artikel", ds.Tables("SP_X").Columns(0), ds.Tables(1).Columns("SP_Y")) Du mußt auch hier für Deine Zwecke anpassen:
If DirectCast(prow("SP_X"), String) = "out of stock" Then | |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Vegas85 | Datum: 21.09.15 00:25 |
| Dim dr As New DataRelation("Artikel", ds.Tables("SP_2").Columns(0), ds.Tables( _
1).Columns("SP_13"))
Fehler:
Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt. Ich glaub ich gebe es auf... bekomme es nicht zum laufen
Muss mich doch erst noch mehr da rein lesen bringt so nichts.
Aber wäre es nützlich wenn du die beiden csv dateien hättest ?
Beitrag wurde zuletzt am 21.09.15 um 00:37:02 editiert. | |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Manfred X | Datum: 21.09.15 00:39 |
| Mein Fehler ... gääähn! Table-Index mit Columnindex verwechselt ...
'Datarelation definieren
Dim dr As New DataRelation _
("Artikel", ds.Tables(0).Columns("SP_X"), ds.Tables(1).Columns("SP_Y")) Gute Nacht allerseits | |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Vegas85 | Datum: 21.09.15 01:10 |
| Gute Nacht
'per Relation zugeordnete Childrow in csv2
For Each crow As DataRow In prow.GetChildRows(dr)
Fehler:
Die Zeile gehört nicht zum selben DataSet wie diese Beziehung. Ich glaub ich gebe es auf... bekomme es nicht zum laufen
Muss mich doch erst noch mehr da rein lesen bringt so nichts.
Aber wäre es nützlich wenn du die beiden csv dateien hättest ?
| |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Vegas85 | Datum: 21.09.15 19:15 |
| Bekomme leider den Fehler nicht weg
Woran könnte das liegen? Vielleicht Flasche Spalten?
Hab da schon alles versucht komme nicht drauf | |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Manfred X | Datum: 21.09.15 19:27 |
| Ich kann nur vermuten, daß Du in Deinem Code diese Zeile "verschluckt" hast:
ds.Relations.Add(dr)
| |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Vegas85 | Datum: 21.09.15 19:59 |
| Ach bin ich so doof genau das ist es auch...
Dafür bekomme ich nun bei
ds.Relations.Add(dr)
Fehler:Diese Spalten haben momentan keine eindeutigen Werte. Ich habe auch jetzt zum test mal beide csv dateien bearbeit und nur 10 zeilen zum test rein gemacht und den text 1:1 rein kopiert damit auch wirklich das gleiche in den csv dateien steht. So das ich wenigstens den code mal zum laufen bekomme aber leider auch fehl anzeige
Beitrag wurde zuletzt am 21.09.15 um 20:00:54 editiert. | |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Manfred X | Datum: 21.09.15 20:07 |
| Ich kenne den Inhalt Deiner Dateien nicht.
Offenbar ist keine eindeutige Beziehung zwischen diesen Tabellen-Zeilen
anhand der Relations-Spalten einzurichten.
Wie sind diese Tabellen miteinander verknüpft ???
Geht es um die reine/rohe Abfolge/Position der Datensätze in der Datei ???
| |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Vegas85 | Datum: 21.09.15 20:24 |
| Weiß nicht genau was du meinst.
Aber hier vieleicht kannst du dir ja die mal anschauen
csv1.csv
csv2.csv
| |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Manfred X | Datum: 21.09.15 20:38 |
| Hallo!
Alles klar!
Meldung: [I]Die Einschränkung konnte nicht aktiviert werden, weil nicht alle
Werte (in csv2) übergeordnete Werte (in csv1) besitzen.[/I]
Was soll mit den Zeilen in csv2 passieren, die keine relationale Entsprechung
in csv1 besitzen?
| |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Vegas85 | Datum: 21.09.15 20:47 |
| Wenn du damit meinst das die Daten in csv 2 nicht vorhanden sind dann einfach ignorieren.
| |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Manfred X | Datum: 21.09.15 20:59 |
| Kleine Hinweis:
Die Zahl hinter "Busch" scheint ein Identifizierer zu sein.
Falls diese Annahme zutrifft:
Schreibe eine kleine Schleife, extrahiere diese Zahl bei jedem Satz
und hänge sie hinten am Datensatz als zusätzliche Spalte an.
Das machst Du für beide Dateien.
Diese beiden Zusatzspalten könnten eine brauchbare Verknüpfung
zwischen den Sätzen schaffen.
| |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Vegas85 | Datum: 21.09.15 21:10 |
| Busch ist ja nur ein Beispiel da gibts normal noch andere Namen ich habe die beiden CSV daten nur gekürzt | |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Manfred X | Datum: 21.09.15 21:24 |
| Dan weiß ich nicht, was in Deinen Dateien drinsteht.
Auf jeden Fall muß jeweils die Überschriftszeile raus.
Ich habe ja bereits dreimal auf den CreateConstraints-Parameter
der Relation hingewiesen, den man auf false setzen kann.
Vielleicht kommt dann etwas brauchbares raus.
| |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Vegas85 | Datum: 21.09.15 21:41 |
| Okay also hier nochmal die beiden dateien sind dieses mal nicht gekürzt und grade frisch erstellt.
csv1.csv
csv2.csv
Also die Überschriftszeile raus nehmen wäre kein problem das kann man ja schnell immer von hand löschen und neu abspeichern.
So im gedanken klingt das total einfach was das Programm machen soll, aber ich merke grade in der umsetztung ist das total schwierrig. Hätte ich nicht gedacht das es doch so kompliziert ist.
Manfred X schrieb:
Zitat: | |
Ich habe ja bereits dreimal auf den CreateConstraints-Parameter
der Relation hingewiesen, den man auf false setzen kann.
Vielleicht kommt dann etwas brauchbares raus.
| |
Da weiß ich leider nicht wo das sein soll
Beitrag wurde zuletzt am 21.09.15 um 21:42:47 editiert. | |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Manfred X | Datum: 21.09.15 21:45 |
| Parameter sind schwer zu finden.
Vielleicht erstellt Microsoft irgendwann eine Dokumentation ...
Dim dr As New DataRelation _
("Artikel", ds.Tables(0).Columns("SP_2"), ds.Tables(1).Columns("SP_13"), _
False) | |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Vegas85 | Datum: 21.09.15 21:58 |
| Ah da kommt das hin da hab ich an einer ganz anderen stelle es versucht.
So nun habe ich schon mal eine datei ausgegeben bekommen.
Bekomme momentan es so angezeigt in der neuen Datei.
Busch 12202 2 Mannschaftswagen H0 301738000000
Busch 12204 Rungen-u.Stirnwandwagen H0 291562000000
Busch 1499 Telegrafenmasten H0 291562000000
Busch 41564 MB 170V »Schneeräumfahrzeug« 291562000000
Busch 5090 Batteriekasten/Schalter H0 301738000000
Busch 5905 Absperrschranken H0 291562000000
Busch 5911 Warnkreuze o. Sch. H0 291562000000
Busch 5935 Blaulicht-Blinkset H0 291562000000
Busch 6048 Motiv-Set »Baustelle« H0 301738000000
Busch 7024 2 E-Lok-Portale H0 301738000000
Busch 7025 2 Dampflok-Portale H0 291562000000
Busch 7052 Streupulver maigrün 291562000000
Busch 7070 Schotter grau H0/N/TT 301738000000 Nur nicht wirklich brauch bar.
Läuft es denn bei dir ?
Fehlt fast nur noch in der Ausgabe datei in Spalte eine das "End" und Spalte 3 das "NotAvailable"
Beitrag wurde zuletzt am 21.09.15 um 22:14:31 editiert. | |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Manfred X | Datum: 21.09.15 22:17 |
| Hast Du noch nie in diese Dateien reingeguckt ????
Wie ich bereits erwartet hatte: Das sind völlig unterschiedliche Schreibweisen
und Textzusammenstellungen in den Tabellen.
So lassen diese Sätze sich nicht kombinieren.
Du mußt zunächst für jedes Fabrikat/jede Marke einheitlichhe Identifizierer
(Teilstrings) ermitteln und daraus eine neue Spalte bilden.
| |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Vegas85 | Datum: 21.09.15 22:22 |
| Achso jetzt weiß ich was du meinst...
Das kann ignoriert werden denn das stellt sich nun nach und nach um.
Da sind noch alte daten in der csv2 die es so noch nicht gibt in der csv1.
Die werden auch nie in der csv1 vorkommen also kann man die ignorieren.
Also sollte nur na dem gesucht werden wo auch vorhanden ist
Beitrag wurde zuletzt am 21.09.15 um 22:24:42 editiert. | |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Manfred X | Datum: 21.09.15 22:35 |
| Schau Dir z.B. mal die BRAWA-Einträge an. Völlig anders.
Brekina gibt es in csv2 nicht. usw.
| |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Vegas85 | Datum: 21.09.15 22:43 |
| Genau da hast du recht.
Brawa hatte ich mal per Hand eingeben und deswegen sind die komplett anders.
Ich habe mir ein tool programmiert der die Zeilen "in stock" aus csv1 hochlädt.
Da habe ich bis jetzt nur Faller und Busch gemacht deswegen sind nur diese einträge gleich alle anderen sind unterschiedlich.
Die anderen Brekina usw. muss ich noch machen also die kommen noch dazu.
Soweit funktioniert es ja nun habe nur die Daten wo "out of Stock" und vorhanden sind aus der csv2 in meiner neuen ausgabe datei. Das klappt nun prima.
Fehlt nur noch das er in zuerst in Spalte 0 das mit dem "End" macht und in Spalte 2 das mit dem "NotAvailable".
Wenn das noch dabei wäre dann würde ja soweit alles gehen.
Kann man da noch irgendwie was mit einbauen das man sieht was das Programm grade macht ? Denn so sieht man ja nicht obs geklappt hat oder ob er Fertig ist.
| |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Manfred X | Datum: 21.09.15 22:53 |
| Mit Messageboxen ...
Private Sub frmCSV2_Load(sender As System.Object, _
e As System.EventArgs) Handles MyBase.Load
ds.Tables.Add(LoadCSV("C:\downloads\csv1.csv"))
ds.Tables.Add(LoadCSV("C:\downloads\csv2.csv"))
If Not ds.Tables.Count = 2 Then
MessageBox.Show("Eine Datei konnte nicht gelesen werden")
Exit Sub
End If
'Datarelation
Dim dr As New DataRelation _
("Artikel", ds.Tables(0).Columns("SP_2"), _
ds.Tables(1).Columns("SP_13"), False)
ds.Relations.Add(dr)
'Spalten in Ausgabedatei erstellen
dtout = New cDataTableCSV
dtout.Columns.Add("SP_0") : dtout.Columns.Add("SP_1")
dtout.Columns.Add("SP_2")
Try
'Schleife über csv1-Zeilen (=Parent)
For Each prow As DataRow In ds.Tables(0).Rows
'Suchkriterium in csv1
If DirectCast(prow("SP_10"), String) = "out of stock" Then
'per Relation zugeordnete Childrow in csv2
For Each crow As DataRow In prow.GetChildRows(dr)
'Ausgabedatensatz aufbauen
Dim orow As DataRow = dtout.NewRow
orow("SP_0") = "End"
orow("SP_1") = prow("SP_2")
orow("SP_2") = prow("SP_10")
dtout.Rows.Add(orow)
Next crow
End If
Next prow
Catch ex As Exception
MessageBox.Show("Abbruch - Fehler: " & ex.Message)
Exit Sub
End Try
'Zeilen als Datei ausgeben
If Not dtout.SaveFile("C:\daten\csv_out.csv", ";"c) Then
MessageBox.Show("Fehler beim Schreiben der Datei")
Else
MessageBox.Show _
(dtout.Rows.Count.ToString & " Zeilen sind geschrieben worden")
End If
End Sub | |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Vegas85 | Datum: 21.09.15 23:05 |
| Wow das ist sehr gut klappt super
Nur ich habe noch was kleines geändert
Dim orow As DataRow = dtout.NewRow
orow("SP_0") = "End"
orow("SP_1") = prow("SP_0")
orow("SP_2") = prow("SP_10")
dtout.Rows.Add(orow) Habe bei orow("SP_1") = prow("SP_2") eine 0 rein gemacht damit er mir Spalte 0 aus csv2 abspeichert.
Das klappt auch aber die werten stimmen nicht.
4001740000000
4001740000000
4001740000000
4001740000000
4001740000000
4001740000000
4001740000000
4001740000000
4001740000000
4001740000000
4001740000000
Ist immer das gleiche und genau das ist das Wichtigste was ich brauche | |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Manfred X | Datum: 21.09.15 23:11 |
| prow ist die Row in der Parenttable (csv1).
crow ist die Row in der Childtable (csv2).
Im Werte aus der csv2 in die Ausgabezeile einzutragen:
orow("...") = crow("...")
| |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Vegas85 | Datum: 21.09.15 23:25 |
| Okay nun hab ich das verstanden.
Auch so abgeändert.
Aber es werden immer noch nicht richtig die Daten übernommen
So werden sie gespeicher.
301738000000 Busch 12202 2 Mannschaftswagen H0
291562000000 Busch 12204 Rungen-u.Stirnwandwagen H0
291562000000 Busch 1499 Telegrafenmasten H0
291562000000 Busch 1543 Unterstand für Loren H0
291562000000 Busch 41564 MB 170V »Schneeräumfahrzeug«
301738000000 Busch 5090 Batteriekasten/Schalter H0 Aber in csv2 stehen sie so
301738167163 Busch 12202 2 Mannschaftswagen H0
291562057194 Busch 12204 Rungen-u.Stirnwandwagen H0
291562105695 Busch 1499 Telegrafenmasten H0
291562105821 Busch 1543 Unterstand für Loren H0
291562109537 Busch 41564 MB 170V »Schneeräumfahrzeug«
301738223448 Busch 5090 Batteriekasten/Schalter H0 Kann es sein das da beim auslesen irgendwie diese nummer sich ändern ?
Beitrag wurde zuletzt am 21.09.15 um 23:28:18 editiert. | |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Manfred X | Datum: 22.09.15 00:05 |
| In der csv-Datei, die ich vorhin runtergeladen habe, steht
in der Spalte Artikelnummer im Satz "Busch 12202" der Wert: 3,01738E+11
| |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Vegas85 | Datum: 22.09.15 00:07 |
| Okay habe den fehler gefunden und zwar ist das wenn ich die csv mit excel bearbeite und wenn ich die datei dann neu abspeichere dann verändern sich die zahlen warum auch immer
Naja noch was anderes wie kann ich beim speichern noch ein header einfügen ?
Zeile 1 sollte so aussehen Action;ItemID;EndCode und danach die anderen sachen einfügen
Beitrag wurde zuletzt am 22.09.15 um 00:09:55 editiert. | |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Manfred X | Datum: 22.09.15 00:29 |
| Direkt vor dem "try" folgende Code-Zeile einfügen.
dtout.Rows.Add({"Action", "ItemID", "EndCode"}) Bitte keine Strichpunkte anhängen.
Das erledigt die Speicher-Routine !!!
| |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Vegas85 | Datum: 22.09.15 00:35 |
| Yeaaaaaaah es funktioniert nun alles wie ich vor hatte.
Du bist mein Held
Ich danke dir sehr für deine geduld und mühe mir dabei zu helfen
Jetzt hab ich einen gemischten Code
Einer ist Top (der von dir) und der andere wo diese "in stock" verarbeitet ist so lala | |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Vegas85 | Datum: 24.09.15 00:40 |
| Hey
Hätte da noch eine frage.
Wenn ich nur eine csv datei lade wie kann ich in der dataset alle Spalten speichern ?
Damit ich wie unten mir z.b spalte 4 und 5 dazu ausgeben kann.
'CSV-Files lesen
ds.Tables.Add(LoadCSV("E:\csv\csv22.csv"))
If Not ds.Tables.Count = 1 Then
MessageBox.Show("Eine Datei konnte nicht gelesen werden")
Exit Sub
End If
'Datarelation
Dim dr As New DataRelation("Artikel", ds.Tables(0).Columns("SP_4"), _
ds.Tables(0).Columns("SP_5"), False)
ds.Relations.Add(dr)
'Spalten in Ausgabedatei erstellen
dtout = New cDataTableCSV
dtout.Columns.Add("SP_0") : dtout.Columns.Add("SP_1")
dtout.Columns.Add("SP_2") : dtout.Columns.Add("SP_3")
dtout.Columns.Add("SP_4")
Try
'Schleife über csv1-Zeilen (=Parent)
For Each prow As DataRow In ds.Tables(0).Rows
'per Relation zugeordnete Childrow in csv
For Each crow As DataRow In prow.GetChildRows(dr)
'Ausgabedatensatz aufbauen
Dim orow As DataRow = dtout.NewRow
orow("SP_0") = "End"
orow("SP_1") = "test"
orow("SP_2") = "NotAvailable"
orow("SP_3") = crow("SP_4")
orow("SP_4") = crow("SP_5")
dtout.Rows.Add(orow)
TextBox1.AppendText(CStr(orow("SP_1")) & _
Microsoft.VisualBasic.vbCrLf)
Next crow
'End If
Next prow
Catch ex As Exception
MessageBox.Show("Abbruch - Fehler: " & ex.Message)
Exit Sub
End Try
Beitrag wurde zuletzt am 24.09.15 um 00:46:47 editiert. | |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Manfred X | Datum: 24.09.15 09:31 |
| Seltsam.
Wieso steht in Deinem abgewandelten Code eine Datarelation,
wenn Du nur eine Tabelle lädst?
Wenn Du die Zeilen speichern möchtest, benötigst Du den
entfernten Speicherbefehl.
Wenn Du einen größeren Text zur Anzeige aufbauen willst,
sollte das nicht direkt im Control geschehen (ineffizient).
Man verwendet dafür Stringbuilder-Variablen.
'CSV-File lesen
ds.Tables.Add(LoadCSV("E:\csv\csv22.csv"))
If Not ds.Tables.Count = 1 Then
MessageBox.Show("Eine Datei konnte nicht gelesen werden")
Exit Sub
End If
'Spalten in Ausgabedatei erstellen
dtout = New cDataTableCSV
dtout.Columns.Add("SP_0") : dtout.Columns.Add("SP_1")
dtout.Columns.Add("SP_2") : dtout.Columns.Add("SP_3")
dtout.Columns.Add("SP_4")
'Spalteninhalte einer Zeile als Zeichenfolge kombinieren
Dim line As New System.Text.StringBuilder
'Zeilen als Zeichenfolge kombinieren
Dim text As New System.Text.StringBuilder
Try
'Schleife über Tabellen-Zeilen
For Each row As DataRow In ds.Tables(0).Rows
'Ausgabedatensatz aufbauen
Dim orow As DataRow = dtout.NewRow
orow("SP_0") = "End"
orow("SP_1") = "test"
orow("SP_2") = "NotAvailable"
orow("SP_3") = row("SP_4")
orow("SP_4") = row("SP_5")
dtout.Rows.Add(orow)
'Ausgabe-Datensatz als Text aufbereiten
line.Clear()
For i As Integer = 0 To orow.ItemArray.Length - 1
line.Append(orow(i).ToString & ";")
Next i
text.AppendLine(line.ToString)
Next row
Catch ex As Exception
MessageBox.Show("Abbruch - Fehler: " & ex.Message)
Exit Sub
End Try
'Ausgabe als Text anzeigen
textbox1.Text = text.ToString
'Zeilen als csv-Datei ausgeben
If Not dtout.SaveFile("....\csv_out.csv", ";"c) Then
MessageBox.Show("Fehler beim Schreiben der Datei")
Else
MessageBox.Show _
(dtout.Rows.Count.ToString & " Zeilen sind geschrieben worden")
End If | |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Vegas85 | Datum: 24.09.15 21:43 |
| Danke
Von 1 bis 5 werden ja die Header übernommen und wie könnte ich der SP_6 noch einen Header geben ?
orow("SP_0") = row("SP_0")
orow("SP_1") = row("SP_1")
orow("SP_2") = row("SP_2")
orow("SP_3") = row("SP_3")
orow("SP_4") = row("SP_4")
orow("SP_5") = row("SP_5")
orow("SP_6") = "teeeeeeeeeeeest" Für die Ausgabe der Daten ist ja im moment noch eine Textbox.
Was wäre dafür besser gegeinet ein DataGridView oder ein ListView ?
Ich denke mal ein DataGridView wobei ein ListView mit der Ansicht: Details schöner ausschaut im Programm.
Was denkst du dazu ?
Beitrag wurde zuletzt am 24.09.15 um 21:46:38 editiert. | |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Manfred X | Datum: 24.09.15 22:06 |
| Das "Datagridview" beherrscht Datenbindung an diverse Spalten-Datentypen
und das Aussehen des Control kann vielfältig angepaßt werden
(Gestaltung und Farben der Zeilen und Zellen, Gridlines, Header, usw.)
Zudem kann dieses Control umfassend auf den Benutzer reagieren
(Sortieren, Editieren, ...) und dabei zahlreiche Events auslösen
(Formatieren, Zeichnen, ...)
Man muß sich allerdings einarbeiten, um spezielle Ziele damit
realisieren zu können.
Das "Listview"-Control bietet lediglich den Vorteil, daß man auf
einfache Weise dem Nutzer unterschiedliche Listenansichten bieten kann.
Sonst hat es wegen seines eingeschränkten Funktionsumfangs nur Nachteile.
Deine Eingangsfrage habe ich nicht verstanden.
| |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Vegas85 | Datum: 24.09.15 23:44 |
| Okay also werde ich mich mal mit dem Datagridview befassen.
Bei dem anderen code mache ich es ja so
dtout.Rows.Add({"Action", "ItemID", "EndCode"}) Nun bei dem neuen ist ja nun so
Bei Spalte 1 usw wird die Zeile 1 (Header) ja mit übernommen.
Bei Spalte 6 fehlt aber der (Header) so wie auf dem Bild zusehen ist.
Da ja Spalte 6 neu angelegt ist kann ja da nichts übernommen werden.
Achso und die Umlaute werden nicht richtig abgespeichert.
Beitrag wurde zuletzt am 24.09.15 um 23:45:41 editiert. | |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Manfred X | Datum: 25.09.15 01:12 |
| In der Ausfgabe-Tabelle "dtout" werden ALLE Spalten neu angelegt
(dtout.columns.add ....)
Wenn Du eine Headerzeile in die Ausgabedatei einfügen willst,
mußt Du vor der Ausgabe der Werte zunächst einen entsprechenden
Datensatz der richtigen Länge in diese Tabelle einfügen:
dtout.rows.add({"Action", "ItemID", "Title", "SiteID", "Currency", "StartPrice", "Test"})
Du kannst im Ladebefehl von cDatatableCSV (LoadFile) im zweiten Parameter
einen geeigneten Textencoder übergeben, damit die Umlaute korrekt gelesen werden.
Im Code der Speichermethode (SaveFile) kannst Du ebenfalls einen Encoder ergänzen
(dritter Parameter der "WriteAllLines"-Methode).
Beitrag wurde zuletzt am 25.09.15 um 01:18:26 editiert. | |
Re: CSV durchsuchen | | | Autor: Vegas85 | Datum: 25.09.15 09:13 |
| Okay das mit dem Encoder funktioniert nun.
Bei der Headerzeile habe ich noch ein kleines problem.
Denn nun sind sie immer doppelt vorhanden
| |
Re: CSV durchsuchen | | | Autor: Manfred X | Datum: 25.09.15 09:23 |
| Da hast Du wohl ZWEI Codezeilen, in denen Header als Row in die Tabelle dtout
eingetragen werden. Für eine der beiden Codezeilen wirst Du Dich wohl entscheiden
müssen.
| |
Re: CSV durchsuchen | | | Autor: Vegas85 | Datum: 25.09.15 21:01 |
| Habe eigentlich nur einen und zwar den aus deinen vorletzten Beitrag.
Der andere Header wird wohl beim laden übernommen.
Kann man sagen das Zeile 1 beim laden weg gelassen wird und beim speichern neu erstellt wird? | |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Manfred X | Datum: 25.09.15 21:24 |
| Du kannst z.B. aus dieser For-Each-Schleife
'Schleife über Tabellen-Zeilen
For Each row As DataRow In ds.Tables(0).Rows
'.....
Next row eine Index-gesteuerte Schleife machen:
For rowindex As Integer = 1 To ds.Tables(0).Rows.Count - 1
'zusätzliche Zeile einfügen
Dim row As DataRow = ds.Tables(0).Rows(rowindex)
'.....
Next rowindex Wenn Du diese Schleife ab 1 startest, wird die Zeile 0 (Header)
nicht in die Ausgabe übernommen.
| |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Vegas85 | Datum: 25.09.15 22:19 |
| Okay danke das hat nun funktioniert.
Ich teste grad ein wenig die DataGridView.
Mit DataGridView1.DataSource = dtout lasse ich mir die ausgabe nun in der DataGriedView anzeigen.
Klappt soweit super nur habe ich da auch ein Problem mit dem Header.
Wie kann ich da die SP_0 usw durch die richtigen Header ersetzten ? | |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Manfred X | Datum: 26.09.15 00:10 |
| Naja!
"Professionell" wäre es, wenn Du LoadFile-Methode durch einen zusätzlichen
Parameter ergänzen würdest, der angibt, ob die erste gelesene Zeile der
csv-Datei als Headerzeile zu nutzen ist.
Es wäre in dem Fall zunächst eine Zeile aus der Datei zu lesen, aufzuspalten
und deren Felder dienten als Spalten-Benennungen.
| |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Vegas85 | Datum: 26.09.15 12:46 |
| Aber die erste gelesene Zeile ist ja nicht der Header.
Der Header wird ja manuell erstellt am Schluss bevor die csv gespeichert wird.
dtout.rows.add({"Action", "ItemID", "Title", "SiteID", "Currency", "StartPrice", "Test"})
Noch eine Frage wie kann ich zwei Spalten zu einer machen beim Speichern
Dachte da an sowas:
orow("SP_3") = row("SP_3") And row("SP_4")
Oder
orow("SP_3") = row("SP_3", "SP_4") Leider funktioniert beides nicht. Habe schon mehre Varianten versucht. | |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Manfred X | Datum: 26.09.15 16:40 |
| Wenn die Header-Zeile am Anfang der Datei stehen soll,
mußt Du sie erstellen BEVOR andere Zeilen in die Ausgabe-Tabelle
eingetragen werden.
Wenn Du die Header-Zeile erst beim Speichern am Anfang der Tabelle
einfügen willst, geht das mit der InsertAt-Methode.
Dim headerrow As DataRow = dtout.NewRow
headerrow.ItemArray = _
{"Action", "ItemID", "Title", "SiteID", "Currency", "StartPrice", "Test"}
dtout.Rows.InsertAt(headerrow, 0) Wenn Du den String-Content mehrerer Spalten der Eingabetabelle in einer
Spalte der Ausgabetabelle zusammenfassen willst, geht das mit dem &-Operator.
orow("SP_3") = row("SP_3").ToString & " " & row("SP_4").ToString Ich mache hier mal Schluß, weil es nicht Zweck dieses Forums ist,
einen einführenden Programmierkurs zu geben.
| |
Re: CSV durchsuchen und Inhalt der Zeile/Spalte wiedergeben | | | Autor: Vegas85 | Datum: 27.09.15 15:36 |
| Okay kein Thema ich danke dir für die viele Hilfe.
Hast mich echt weiter gebracht und habe viel gelernt dabei.
Bald kommt ja mein bestelltes Buch und dann kann ich weiter lernen.
Thema kann geschlossen werden, falls es hier diese Funktion gibt.
Besten Dank
LG Vegas85
Beitrag wurde zuletzt am 27.09.15 um 15:37:30 editiert. | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
Neu! sevCoolbar 3.0
Professionelle Toolbars im modernen Design!
Mit sevCoolbar erstellen Sie in wenigen Minuten ansprechende und moderne Toolbars und passen diese optimal an das Layout Ihrer Anwendung an (inkl. große Symbolbibliothek) - für VB und MS-Access Weitere InfosTipp des Monats TOP Entwickler-Paket
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR...
Jetzt nur 599,00 EURWeitere Infos
|