CSV subory

Programovacie jazyky, rady, poradňa...
Vifgas
Amateur
Amateur
Príspevky: 20
Registrovaný: 01 dec 2012, 11:03

Re: CSV subory

Príspevok od používateľa Vifgas »

je to napisane len tak do notepadu, bez ziadnej kontroly, asi to budes musiet skontrolovat. tiez si budes musiet osetrit napriklad pripad ze jeden grid ma viac riadkov ako druhy (ak taka moznost teda moze nastat...)
No to co si poslal, tak porovnavam len 1:1 2:2 3:3...lenze ja potrebuje porovnat aj 1:3 1:2 atd..

Podla mna by som potreboval nieco taketo,ale to nefunguje vobec :

Kód: Vybrať všetko

        For i As Integer = 0 To songsDataGridView.Rows.Count
            For j As Integer = 0 To songsDataGridView1.Rows.Count
                If (songsDataGridView.Rows(i).Cells(8).Value = songsDataGridView1.Rows(j).Cells(8).Value) Then
                    ' ked najdes zhodu, nepotrebujes ziadnu isFound premennu, proste das Continue
                    Continue For
                End If
aacid
Hardcore addict
Hardcore addict
Príspevky: 8137
Registrovaný: 22 nov 2006, 21:55
Bydlisko: BA

Re: CSV subory

Príspevok od používateľa aacid »

jaaj, ja som si doteraz myslel ze tych chces porovnavat iba hodnoty na rovnakych riadkoch.

tak potom to ozaj mozes robit aj cez for each, tak ako pises, akurat si tam zabudol pridat este samotne pridavanie toho riadku, teraz (ten kod co si sem napisal) akurat skontroluje ci je rovnaky, ziadny riadok nepridava.

len tam pridaj tento riadok, do toho vnoreneho for, ale az po if-e:

Kód: Vybrať všetko

songsDataGridView2.Rows.Add(songsDataGridView.Rows(i).Clone())
to je ale vec co si si mohol aj sam vsimnut :)
Vifgas
Amateur
Amateur
Príspevky: 20
Registrovaný: 01 dec 2012, 11:03

Re: CSV subory

Príspevok od používateľa Vifgas »

aacid napísal:jaaj, ja som si doteraz myslel ze tych chces porovnavat iba hodnoty na rovnakych riadkoch.

tak potom to ozaj mozes robit aj cez for each, tak ako pises, akurat si tam zabudol pridat este samotne pridavanie toho riadku, teraz (ten kod co si sem napisal) akurat skontroluje ci je rovnaky, ziadny riadok nepridava.

len tam pridaj tento riadok, do toho vnoreneho for, ale az po if-e:

Kód: Vybrať všetko

songsDataGridView2.Rows.Add(songsDataGridView.Rows(i).Clone())
to je ale vec co si si mohol aj sam vsimnut :)
Teraz som celkom zmeteny :) cize tento podovny kod som sem dal (to s tym for each), je dobre? Alebo to for i a for j ?

Ak si myslel toto,tak to nefunguje dobre, pretoze mi to vypise strasne vela riadkov :

Kód: Vybrať všetko

        For i As Integer = 0 To songsDataGridView.Rows.Count - 1
            For j As Integer = 0 To songsDataGridView1.Rows.Count - 1
                If songsDataGridView.Rows(i).Cells(8).Value = songsDataGridView1.Rows(j).Cells(8).Value Then

                    Continue For

                    songsDataGridView2.Rows.Add(songsDataGridView.Rows(i).Clone())
                End If
            Next
        Next
aacid
Hardcore addict
Hardcore addict
Príspevky: 8137
Registrovaný: 22 nov 2006, 21:55
Bydlisko: BA

Re: CSV subory

Príspevok od používateľa aacid »

no zmateny som teraz aj ja.
ja som si cely cas myslel ze ty chces porovnavat len rovnake riadky, teda prvy riadok s prvym riadkom, druhy s druhym, nie kazdy s kazdym.
potom sa celkom meni situacia a toto asi vobec nebude dobre...

takto by som si asi spravil kopie tych dvoch gridov (respektive len tej kolekcie Rows), zacal porovnavat, tak ako doteraz, akurat s tym ze vzdy ked by som nasiel zhodu, tak by som riadok aj z jednej aj z druhej kolekcie vymazal. no a na koniec by som tie dve kolekcie spojil do jednej a dostal by som vlastne vsetky riadky co sa nenachadzaju v oboch gridoch.

druha moznost je pouzit LINQ (tam je metoda Except(), ktora vrati vsetky hodnoty, ktore sa nachadzaju v jednej kolekcii ale nie druhej), ale to je uz trochu zlozitejsie a ked som to skusal nejak sa mi nejak nechceli spravne porovnavat tie dve kolekcie, s LINQ nemam az take skusenosti...

(sorry za ten zmatok, fakt som to zle pochopil..)
Vifgas
Amateur
Amateur
Príspevky: 20
Registrovaný: 01 dec 2012, 11:03

Re: CSV subory

Príspevok od používateľa Vifgas »

Tak myslim ze mi to uz funguje, ale nejako sa vyskytol s tym další problem. Ak za x dosadim cislo bunky, ktora obsahuje datum (vo formate dd.mm.yyyy) alebo cas (vo formate hh:mm:ss) tak mi to proste berie ho uvahy len dd alebo hh a za bodkou alebo dvojbodkou uz tie udaje nie

Kód: Vybrať všetko

(dgv1Row.Cells(x).Value = dgv2Row.Cells(x).Value) 
Ak tam v bunke je klasicke cislo, alebo slova, tak to ide. Kde tam moze byt problem?
aacid
Hardcore addict
Hardcore addict
Príspevky: 8137
Registrovaný: 22 nov 2006, 21:55
Bydlisko: BA

Re: CSV subory

Príspevok od používateľa aacid »

no skusil by som si ulozit obe tie hodnoty do premennej a debugovat preco sa porovnavaju tak ako sa porovnavaju. kedze do gridu bude datum asi ukladany ako string (ano? netusim takto z hlavy), tak mozno bude treba tie hodnoty najprv prekonvertovat na datetime (alebo nieco take) a porovnavat az tak...
Vifgas
Amateur
Amateur
Príspevky: 20
Registrovaný: 01 dec 2012, 11:03

Re: CSV subory

Príspevok od používateľa Vifgas »

Dalsi problem :) Tento kod exportuje DataGridView do csv a za kazdy stlpec dava ; Nevies mi nejako jednoducho poradit ako tam dat pevnu sirku stlpcov? Napr 1 bude mat 10 znakov, 2 15 znakov atd? Aby to exportovalo bez ; len pevne sirky

Kód: Vybrať všetko

        Dim rows = From row As DataGridViewRow In songsDataGridView2.Rows.Cast(Of DataGridViewRow)() _

                   Where Not row.IsNewRow _

                   Select Array.ConvertAll(row.Cells.Cast(Of DataGridViewCell).ToArray, Function(c) If(c.Value IsNot Nothing, c.Value, ""))

        Using sw As New IO.StreamWriter("\\nm-fs01\it\Backup\IBEA\new.csv")

            For Each r In rows

                sw.WriteLine(String.Join(";", r))

            Next

        End Using 
aacid
Hardcore addict
Hardcore addict
Príspevky: 8137
Registrovaný: 22 nov 2006, 21:55
Bydlisko: BA

Re: CSV subory

Príspevok od používateľa aacid »

skus pozriet na tejto stranke ze "Padding":
http://www.dotnetperls.com/string-format-vbnet

to je myslim to co chces.
Vifgas
Amateur
Amateur
Príspevky: 20
Registrovaný: 01 dec 2012, 11:03

Re: CSV subory

Príspevok od používateľa Vifgas »

Ak to tam dam, tak mi pise : Error 1 Value of type 'String' cannot be converted to '1-dimensional array of String'.

Kód: Vybrať všetko

            Using MyReader As New Microsoft.VisualBasic.FileIO.TextFieldParser(csvpath1)
                MyReader.TextFieldType = FileIO.FieldType.Delimited
                MyReader.SetDelimiters(";")
            Dim currentRow As String() = "{0,-10} {1,10} {0,-10} {0,-10} {1,10}"

                Dim riadok As Integer

                While Not MyReader.EndOfData
                    Application.DoEvents()
                    Try
                        currentRow = MyReader.ReadFields()
                        riadok = riadok + 1
                        If (riadok > 1) Then
                            With songsDataGridView
                                .ColumnCount = 64
                                Dim row As String() = New String() {"21544a", currentRow(1), currentRow(2), currentRow(3), currentRow(4)}
                                .Rows.Add(row)
                            End With
                        End If

                    Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException
                        MsgBox("Line " & ex.Message & _
                          "is not valid and will be skipped.")
                    End Try
                End While
            End Using
aacid
Hardcore addict
Hardcore addict
Príspevky: 8137
Registrovaný: 22 nov 2006, 21:55
Bydlisko: BA

Re: CSV subory

Príspevok od používateľa aacid »

ved si pisal ze chces z GridView exportovat do csv a teraz ten kod pouzivas pri importe...
ved sa pozri co robis, precitaj si ten error a musi ti byt jasne, ze ked Rows.Add() ocakava pole stringov a ty mu tam vlozis jeden dlhy string, tak ti to asi nepojde...
Vifgas
Amateur
Amateur
Príspevky: 20
Registrovaný: 01 dec 2012, 11:03

Re: CSV subory

Príspevok od používateľa Vifgas »

Moja chyba :) ale v podstate ak mi to da pri importe,tak mi to spravi aj pri exporte...spravil som to takto : currentRow(1).PadRight(20, " ") ... cize mi to napise moj text v bunke a pride do 20 prazdne znaky
aacid
Hardcore addict
Hardcore addict
Príspevky: 8137
Registrovaný: 22 nov 2006, 21:55
Bydlisko: BA

Re: CSV subory

Príspevok od používateľa aacid »

ked to ide, tak dobre, ale pride mi zbytocne to davat formatovane uz do toho gridview, ked s tymi datami v gridview budes potrebovat nieco robit, tak ich tam budes mat s prazdnymi znakmi a budes to musiet trimovat...
Vifgas
Amateur
Amateur
Príspevky: 20
Registrovaný: 01 dec 2012, 11:03

Re: CSV subory

Príspevok od používateľa Vifgas »

To je pravda,ale exportovy kod na to nemam momentalne pripraveny a s tymito datami sa nic nebude robit,len ich potrebujem nacitat a vyexportovat...viem ze to neni elegantne riesenie,ale ak funguje,tak som rad

//autoeditácia príspevku (11 Mar 2013, 10:36)
Asi trochu mimo otazka, ale ako spravit tento kod tak, aby na konci toho kodu mohlo byt dgv2Row.Cells(6).Value ... potrebujem tam dostat udaj dgv2 ...

Kód: Vybrať všetko

     Dim isFound As Boolean

        'Start iterating through datagridview1
        For Each dgv1Row As DataGridViewRow In songsDataGridView.Rows
            'and for each iteration through datagridview1 iterate through all of datagrid2
            isFound = False

            For Each dgv2Row As DataGridViewRow In songsDataGridView1.Rows
                'compare each iteration of dgv1 with each iteration of dgv2
                If (dgv1Row.Cells(8).Value = dgv2Row.Cells(8).Value) Then
                    'if there is a match, we don't want to add it so set Found
                    isFound = True
                End If
            Next

            'only add to datagridview3 if isFound = false (meaning there was no
            'match from the current row in dgv1 to any of the rows in dgv2)
            If Not isFound Then
                songsDataGridView2.Rows.Add(dgv1Row.Cells(0).Value, dgv1Row.Cells(1).Value, dgv1Row.Cells(2).Value, dgv1Row.Cells(3).Value, dgv1Row.Cells(4).Value, dgv1Row.Cells(5).Value,                                           dgv2Row.Cells(6).Value)
            End If
        Next

aacid
Hardcore addict
Hardcore addict
Príspevky: 8137
Registrovaný: 22 nov 2006, 21:55
Bydlisko: BA

Re: CSV subory

Príspevok od používateľa aacid »

a co tam chces mat z toho songsDataGridView1? pretoze ty porovnavas jeden riadok z GridView so vsetkymi riadkami z GridView1...
chces tam mat hodnotu z druheho gridu z rovnakeho riadku ako je v prvom gride? potom takto nejak:

Kód: Vybrať všetko

songsDataGridView1(songsDataGridView.IndexOf(dgv1Row)).Cells(6)
IndexOf ti vrati poradie dgv1Row v songsDataGridView
Vifgas
Amateur
Amateur
Príspevky: 20
Registrovaný: 01 dec 2012, 11:03

Re: CSV subory

Príspevok od používateľa Vifgas »

Sorry za spam.

//autoeditácia príspevku (03 Apr 2013, 13:12)
Caute. tento kod mi nacita csv subor do dataGrivView a dalsi csv pod neho...ja by som ale potreboval ich dat vedla seba do DataGV.Nejaka rada?

Kód: Vybrať všetko

'Prve nacitanie
        Using MyReader As New Microsoft.VisualBasic.FileIO.TextFieldParser(csvpath)
            MyReader.TextFieldType = FileIO.FieldType.Delimited
            MyReader.SetDelimiters(";")
            Dim currentRow As String()
            Dim riadok As Integer
            While Not MyReader.EndOfData
                Application.DoEvents()
                Try
                    currentRow = MyReader.ReadFields()
                    riadok = riadok + 1
                    If (riadok > 1) Then
                        With songsDataGridView4
                            .ColumnCount = 4
                            Dim row As String() = New String() {currentRow(0), currentRow(1), currentRow(2), currentRow(3)}
                            .Rows.Add(row)
                        End With
                    End If
                Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException
                    MsgBox("Line " & ex.Message & _
                      "is not valid and will be skipped.")
                End Try
            End While
        End Using

'Druhe nacitanie
        Using MyReader As New Microsoft.VisualBasic.FileIO.TextFieldParser(csvpathnew)
            MyReader.TextFieldType = FileIO.FieldType.Delimited
            MyReader.SetDelimiters(";")
            Dim currentRow As String()
            Dim riadok As Integer
            While Not MyReader.EndOfData
                Application.DoEvents()
                Try
                    currentRow = MyReader.ReadFields()
                    riadok = riadok + 1
                    If (riadok > 0) Then
                        With songsDataGridView4
                            .ColumnCount = 4
                            Dim row As String() = New String() {currentRow(0), currentRow(1), currentRow(2), currentRow(3)}
                            .Rows.Add(row)
                        End With
                    End If
                Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException
                    MsgBox("Line " & ex.Message & _
                      "is not valid and will be skipped.")
                End Try
            End While
        End Using

Napísať odpoveď