Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    VB.NET modificare un file CSV

    Ciao Ragazzi,
    Sto impazzendo, letteralmente!
    Dovrei creare una soluzione che modifichi in maniera autonoma (una volta selezionato il file di origine) un file CSV, in base al valore di alcune colonne...
    La fase di caricamento è stata semplice, lo visualizzo in una DataGridView senza problemi.

    Il file è strutturato in questo modo :


    A B C D E F G H I
    A1 10 11 12 13 14 88 8894 112 46512
    A2 67 5 77 5478 95 8990 54 89 56
    B1 124 -1 142 10943 176 17892 -8786 66 -46400
    B2 181 -7 207 16408 257 26794 -17626 43 -92856
    C1 238 -13 272 21873 338 35696 -26466 20 -139312
    C2 295 -19 337 27338 419 44598 -35306 -3 -185768
    D1 352 -25 402 32803 500 53500 -44146 -26 -232224
    D2 409 -31 467 38268 581 62402 -52986 -49 -278680
    E1 466 -37 532 43733 662 71304 -61826 -72 -325136
    E2 523 -43 597 49198 743 80206 -70666 -95 -371592


    devo trovare il modo di fare esattamente questo:

    Se la somma delle righe A, colonna E (due per volta, quindi A1+A2 = x \\\ B1+B2 = y) è maggiore di un valore, allora bisogna cancellare l'intera riga.

    Vi prego, qualche idea?
    ci sto sbattendo la testa da diversi giorni ma non riesco a venirne a capo.
    Grazie!!!!!

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Non hai iniziato a scrivere del codice per fare quanto descrivi (e la somma ...) ?


    P.S. La sezione è sbagliata
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Thread spostato nella sezione corretta, in futuro stai più attento.

    Comunque, se devi fare una modifica automatica a che serve caricarlo nella DataGridView? Leggi il file riga per riga, fai lo split sulle virgole, individua i valori che ti interessano, convertili ad interi e fai i conti che devi fare; se la riga è da tenere la scrivi nel file di output, se no la ignori. Alla fine, chiusi entrambi i file, muovi il nuovo sul vecchio (o in alternativa, se il file non è troppo grande, puoi tenere tutto l'output in memoria e poi scrivere sul file di input).
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Grazie per le risposte ragazzi.
    Io sto leggendo i CSV in questo modo (magari è anche sbagliato), il problema è che non so come continuare...
    So che non è abitudine del forum dare codici belli e pronti, però riga di codice sarebbe di aiuto...
    Please!

    Dopo averlo selezionato con una comunissima OpenDialog, lo leggo:
    codice:
            Dim TextFileReader As New Microsoft.VisualBasic.FileIO.TextFieldParser(TextBox1.Text)
    
    
            TextFileReader.TextFieldType = FileIO.FieldType.Delimited
            TextFileReader.SetDelimiters(";")
    
    
            Dim TextFileTable As DataTable = Nothing
    
    
            Dim Column As DataColumn
            Dim Row As DataRow
            Dim UpperBound As Int32
            Dim ColumnCount As Int32
            Dim CurrentRow As String()
    
    
            While Not TextFileReader.EndOfData
                Try
                    CurrentRow = TextFileReader.ReadFields()
                    If Not CurrentRow Is Nothing Then
                        ''# Check if DataTable has been created
                        If TextFileTable Is Nothing Then
                            TextFileTable = New DataTable("TextFileTable")
                            ''# Get number of columns
                            UpperBound = CurrentRow.GetUpperBound(0)
                            ''# Create new DataTable
                            For ColumnCount = 0 To UpperBound
                                Column = New DataColumn()
                                Column.DataType = System.Type.GetType("System.String")
                                Column.ColumnName = "Column" & ColumnCount
                                Column.Caption = "Column" & ColumnCount
                                Column.ReadOnly = True
                                Column.Unique = False
                                TextFileTable.Columns.Add(Column)
                            Next
                        End If
                        Row = TextFileTable.NewRow
                        For ColumnCount = 0 To UpperBound
                            Row("Column" & ColumnCount) = CurrentRow(ColumnCount).ToString
                        Next
                        TextFileTable.Rows.Add(Row)
                    End If
                Catch ex As  _
                Microsoft.VisualBasic.FileIO.MalformedLineException
                    MsgBox("riga" & ex.Message & _
                    "non valida.")
                End Try
            End While
            TextFileReader.Dispose()
            DataGridView1.DataSource = TextFileTable
    Ultima modifica di MItaly; 24-08-2014 a 18:19

  5. #5
    Come detto, non starei a complicarmi la vita così... Basterebbe una cosa del tipo:
    codice:
    Import System.IO
    Import System.Collections.Generic
    
    ...
    
    Dim fileName As String = ....
    Dim out As New List<String>()
    Using fs As New StreamReader(fileName)
        While True
            Dim r1 As String = fs.ReadLine()
            Dim r2 As String = fs.ReadLine()
            If r2 Is Nothing Then Exit While
            Dim s1() As String = r1.Split(";"c)
            Dim s2() As String = r2.Split(";"c)
            If CInt(s1(4))+CInt(s2(4)) < numeroMagico Then
                out.Add(r1)
                out.Add(r2)
            End If
        End While
    End Using
    Using sw As New StreamWriter(fileName)
        For Each s In out
            sw.WriteLine(s)
        End For
    End Using
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Grazie mille per la risposta, ma non riesco a capire cosa intendi per
    Dim out As New List<String>()

    ho provato a modificare il tuo codice in questo modo :

    codice:
            Dim out As New DataGridViewRow
            Using fs As New StreamReader(ApriPath)
                While True
                    Dim r1 As String = fs.ReadLine(2)
                    Dim r2 As String = fs.ReadLine(3)
                    If r2 Is Nothing Then Exit While
                    Dim s1() As String = r1.Split(";"c)
                    Dim s2() As String = r2.Split(";"c)
                    If CInt(s1(12)) + CInt(s2(12)) < 121 Then
                        DataGridView2.Rows.Add(r1)
                        DataGridView2.Rows.Add(r2)
                    End If
                End While
            End Using
    VS genera un errore : indici oltre i limiti della matrice.
    Ultima modifica di MItaly; 25-08-2014 a 00:18 Motivo: Aggiunti tag CODE

  7. #7
    Ragazzi, penso di esserci quasi...

    Vi posto il codice che sto utilizzando
    codice:
     Dim Sr As New StreamReader(System.Environment.GetFolderPath(Environment.SpecialFolder.Desktop) & "\calcolo.csv")
            Dim Sw As New StreamWriter(System.Environment.GetFolderPath(Environment.SpecialFolder.Desktop) & "\calcolo_new.csv")
            Dim Out As New List(Of String)
            Dim r1 As String = Sr.ReadLine()
            Dim r2 As String = Sr.ReadLine()
    
    
            While Not Sr.EndOfStream
    
    
                Dim s1() As String = r1.Split(";"c)
                Dim s2() As String = r2.Split(";"c)
                If (CInt(s1(13)) + CInt(s2(13))) < 121 Then
                    Out.Add(r1)
                    Out.Add(r2)
                    Sw.WriteLine(r1)
                    Sw.WriteLine(r2)
                End If
            End While
    
    
            Sr.Close()
            Sw.Close()
            Application.Exit()
    L'unico problema adesso è che il programma non smette mai di leggere il file CSV.
    Secondo me è un problema del ciclo While o al massimo, perchè non "scorre" le righe.
    Come potrei risolvere?
    Ultima modifica di MItaly; 25-08-2014 a 00:19 Motivo: Aggiunti tag CODE

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Non mi pare che ci sia una lettura di Sr dentro al ciclo ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.