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

    Regex su stringa con condizioni particolari

    Salve a tutti, chiedo il vostro aiuto per un problema che non riesco a risolvere. Spero che qualcuno possa darmi una mano. Ho un file .csv (di prodotti) che apro in lettura e che è formato dai seguenti campi:

    riga 1 -> sku, description, image, price
    riga 2 -> 001, questa è la prima descrizione, img01, 10
    riga 3 -> 002, "questa, dovrebbe essere la seconda descrizione", img02, 11
    riga 4 -> 003, "questa è, forse, l'ultima descrizione", img03, 12

    il mio problema consiste nel riuscire a trovare una espressione regolare che analizzi le varie righe e quando trova i doppi apici e all'interno di questi una o più virgole li consideri come campo unico. Esempio le stringhe presente alle righe 3 e 4 devono essere considerate indipendentemente dai doppi apici e dal numero di virgole presenti tra essi, appartenenti al campo descrizione del prodotto.

    Premetto che non sono proprio espertissimo di regex ma ho provato lo stesso a cimentarmi con una cosa del genere (che ovviamente non funziona):

    codice:
    public static String[] parseCSVLine(String line) {
        Pattern p = Pattern.compile(",(?=((\")?([a-zA-Z0-9,_-]*)(\")?))");
        String[] fields = p.split(line);
        ....
        return fields;
    }

  2. #2
    Utente di HTML.it L'avatar di neroux
    Registrato dal
    Aug 2009
    Messaggi
    1,973
    Non sarei sicuro che una regexp sia il modo migliore. Potresti provare http://commons.apache.org/csv/

    www.sitemeer.com » Quando un sito pare irraggiungibile

    Se ti piace ci puoi trovare anche su Facebook

  3. #3
    neroux ti ringrazio per la risposta. Provo e ti faccio sapere

  4. #4
    Rieccomi con un problema analogo. Diciamo che ho risolto in parte. Ho applicato il metodo sopra descritto cercando di usare opencsv e per la lettura devo ammettere che il problema del file .csv l'ho risolto. Ne nasce però un altro e cioè non riesco a effettuare una modifica all'interno di un campo della riga. Mi spiego meglio ripostando la struttura del file:

    riga 1 -> sku, description, image, price
    riga 2 -> 001, questa è la prima descrizione, img01, 10
    riga 3 -> 002, "questa, dovrebbe essere la seconda descrizione", img02, 11
    riga 4 -> 003, "questa è, forse, l'ultima descrizione", img03, 12

    Deve succedere che dopo aver aperto in lettura il file, riesca a modificare il campo price di tutte le righe aggiungendogli +10. Il tutto deve essere poi scritto su un nuovo file .csv. Cioè il file dovrebbe risultare in questo modo:

    riga 1 -> sku, description, image, price
    riga 2 -> 001, questa è la prima descrizione, img01, 20
    riga 3 -> 002, "questa, dovrebbe essere la seconda descrizione", img02, 21
    riga 4 -> 003, "questa è, forse, l'ultima descrizione", img03, 22

    Ho utilizzato il seguente codice per la lettura:

    codice:
    package com.csvreaderwriter;
    
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.util.List;
    import java.util.StringTokenizer;
     
    import au.com.bytecode.opencsv.CSVReader;
    import au.com.bytecode.opencsv.CSVWriter;
    import au.com.bytecode.opencsv.bean.ColumnPositionMappingStrategy;
    import au.com.bytecode.opencsv.bean.CsvToBean;
     
    public class CopyOfParseCSVFile {
     
        public static void main(String[] args) throws IOException {
        	String filename = "products_complete_2.csv";    	
            CopyOfParseCSVFile parseCSVFile = new CopyOfParseCSVFile();
            System.out.println("Starting to parse CSV file using opencsv");
            parseCSVFile.parseUsingOpenCSV(filename);
        }  
     
        private void parseUsingOpenCSV(String filename){
     
            try {
                
                CSVReader reader = new CSVReader(new FileReader(filename));
                String [] nextLine;
                int rowNumber = 0;
                
                while ((nextLine = reader.readNext()) != null) {
                    rowNumber++;
                    for(int i = 0;i< nextLine.length; i++){
                    	
                        //display CSV values
                        System.out.println("Cell column index: " + i);
                        System.out.println("Cell Value: " + nextLine[i]);
                        Come faccio a prendere qui il valore di price per poi effettuare quell'operazione di addizione? 
                        System.out.println("---");
                    }
                }
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
     
    }
    Spero che qualcuno riesca ad aiutarmi.

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.