2010-06-06 4 views
5

Je lis 2 fichiers csv: store_inventory & new_acquisitions.
Je veux pouvoir comparer le fichier csv store_inventory avec new_acquisitions. 1) Si les noms des éléments correspondent, il suffit de mettre à jour la quantité dans store_inventory. 2) Si new_acquisitions a un nouvel élément qui n'existe pas dans store_inventory, ajoutez-le au store_inventory.Java: fichier CSV Lecture et écriture

Voici ce que j'ai fait jusqu'à présent mais ce n'est pas très bon. J'ai ajouté des commentaires où j'ai besoin d'ajouter des tâches & .
Tout conseil ou code pour faire les tâches ci-dessus serait génial! Merci.

File new_acq = new File("/src/test/new_acquisitions.csv"); 
    Scanner acq_scan = null; 
    try { 
     acq_scan = new Scanner(new_acq); 
    } catch (FileNotFoundException ex) { 
     Logger.getLogger(mainpage.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    String itemName; 
    int quantity; 
    Double cost; 
    Double price; 

    File store_inv = new File("/src/test/store_inventory.csv"); 
    Scanner invscan = null; 
    try { 
     invscan = new Scanner(store_inv); 
    } catch (FileNotFoundException ex) { 
     Logger.getLogger(mainpage.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    String itemNameInv; 
    int quantityInv; 
    Double costInv; 
    Double priceInv; 


    while (acq_scan.hasNext()) { 
     String line = acq_scan.nextLine(); 
     if (line.charAt(0) == '#') { 
      continue; 
     } 
     String[] split = line.split(","); 

     itemName = split[0]; 
     quantity = Integer.parseInt(split[1]); 
     cost = Double.parseDouble(split[2]); 
     price = Double.parseDouble(split[3]); 


     while(invscan.hasNext()) { 
      String line2 = invscan.nextLine(); 
      if (line2.charAt(0) == '#') { 
       continue; 
      } 
      String[] split2 = line2.split(","); 

      itemNameInv = split2[0]; 
      quantityInv = Integer.parseInt(split2[1]); 
      costInv = Double.parseDouble(split2[2]); 
      priceInv = Double.parseDouble(split2[3]); 


      if(itemName == itemNameInv) { 
       //update quantity 

      } 
     } 
     //add new entry into csv file 

    } 

Merci encore pour toute aide. =]

+1

vous trouverez que vous obtenez plus et de meilleures réponses si vous demandez en fait une question. –

Répondre

5

Suggère que vous utilisiez l'un des analyseurs CSV existants tels que Commons CSV ou Super CSV au lieu de réinventer la roue. Devrait rendre votre vie beaucoup plus facile.

+0

J'ai téléchargé opencsv, mais je n'ai aucune idée de la façon d'utiliser la bibliothèque. Pourriez-vous me diriger dans la bonne direction s'il vous plaît. Im utilisant netbeans – nubme

+0

Pour des exemples sur la lecture et l'écriture avec opencsv, voir http://opencsv.sourceforge.net/#how-to-read – seangrieve

1

L'opération que vous effectuez exigera que, pour chaque élément de vos nouvelles acquisitions, vous deviez rechercher chaque élément dans l'inventaire pour une correspondance. Ce n'est pas seulement efficace, mais le scanner que vous avez configuré pour votre fichier d'inventaire doit être réinitialisé après chaque élément. Je suggérerais que vous ajoutiez vos nouvelles acquisitions et votre inventaire aux collections, puis que vous itérez vos nouvelles acquisitions et que vous recherchiez le nouvel élément dans votre collection d'inventaire. Si l'élément existe, mettez à jour l'élément. Si ce n'est pas le cas, ajoutez-le à la collection d'inventaire. Pour cette activité, il peut être utile d'écrire une classe simple pour contenir un élément d'inventaire. Il pourrait être utilisé à la fois pour les nouvelles acquisitions et pour l'inventaire. Pour une recherche rapide, je suggère que vous utilisiez HashSet ou HashMap pour votre collection d'inventaire.

À la fin du processus, n'oubliez pas de conserver les modifications apportées à votre fichier d'inventaire.

3

Votre implémentation fait l'erreur commune de casser la ligne sur les virgules en utilisant line.split(","). Cela ne fonctionne pas car les valeurs elles-mêmes peuvent contenir des virgules. Si cela se produit, la valeur doit être citée et vous devez ignorer les virgules dans les guillemets. La méthode split ne peut pas faire cela - je vois beaucoup cette erreur.

Voici la source d'une mise en œuvre qui fait correctement: http://agiletribe.wordpress.com/2012/11/23/the-only-class-you-need-for-csv-files/

1

que Java ne prend pas en charge l'analyse des fichiers CSV en mode natif, nous devons compter sur la bibliothèque tiers. Opencsv est l'une des meilleures bibliothèques disponibles à cet effet. Il est open source et est livré avec la licence Apache 2.0 qui permet une utilisation commerciale.

Ici, this link devrait vous aider et d'autres dans les situations!

1

Avec l'aide de la bibliothèque open source uniVocity-parsers, vous pouvez développer avec le code assez propre comme suit:

private void processInventory() throws IOException { 
    /** 
    * --------------------------------------------- 
    * Read CSV rows into list of beans you defined 
    * --------------------------------------------- 
    */ 
    // 1st, config the CSV reader with row processor attaching the bean definition 
    CsvParserSettings settings = new CsvParserSettings(); 
    settings.getFormat().setLineSeparator("\n"); 
    BeanListProcessor<Inventory> rowProcessor = new BeanListProcessor<Inventory>(Inventory.class); 
    settings.setRowProcessor(rowProcessor); 
    settings.setHeaderExtractionEnabled(true); 

    // 2nd, parse all rows from the CSV file into the list of beans you defined 
    CsvParser parser = new CsvParser(settings); 
    parser.parse(new FileReader("/src/test/store_inventory.csv")); 
    List<Inventory> storeInvList = rowProcessor.getBeans(); 
    Iterator<Inventory> storeInvIterator = storeInvList.iterator(); 

    parser.parse(new FileReader("/src/test/new_acquisitions.csv")); 
    List<Inventory> newAcqList = rowProcessor.getBeans(); 
    Iterator<Inventory> newAcqIterator = newAcqList.iterator(); 

    // 3rd, process the beans with business logic 
    while (newAcqIterator.hasNext()) { 

     Inventory newAcq = newAcqIterator.next(); 
     boolean isItemIncluded = false; 
     while (storeInvIterator.hasNext()) { 
      Inventory storeInv = storeInvIterator.next(); 

      // 1) If the item names match just update the quantity in store_inventory 
      if (storeInv.getItemName().equalsIgnoreCase(newAcq.getItemName())) { 
       storeInv.setQuantity(newAcq.getQuantity()); 
       isItemIncluded = true; 
      } 
     } 

     // 2) If new_acquisitions has a new item that does not exist in store_inventory, 
     // then add it to the store_inventory. 
     if (!isItemIncluded) { 
      storeInvList.add(newAcq); 
     } 
    } 
} 

Il suffit de suivre cet exemple de code, j'ai travaillé selon vos besoins. Notez que la bibliothèque a fourni une API simplifiée et des performances significatives pour l'analyse des fichiers CSV.

0

Pour écrire au format CSV

public void writeCSV() { 

     // Delimiter used in CSV file 
     private static final String NEW_LINE_SEPARATOR = "\n"; 

     // CSV file header 
     private static final Object[] FILE_HEADER = { "Empoyee Name","Empoyee Code", "In Time", "Out Time", "Duration", "Is Working Day" }; 

     String fileName = "fileName.csv"); 
     List<Objects> objects = new ArrayList<Objects>(); 
     FileWriter fileWriter = null; 
     CSVPrinter csvFilePrinter = null; 

     // Create the CSVFormat object with "\n" as a record delimiter 
     CSVFormat csvFileFormat = CSVFormat.DEFAULT.withRecordSeparator(NEW_LINE_SEPARATOR); 

     try { 
      fileWriter = new FileWriter(fileName); 

      csvFilePrinter = new CSVPrinter(fileWriter, csvFileFormat); 

      csvFilePrinter.printRecord(FILE_HEADER); 

      // Write a new student object list to the CSV file 
      for (Object object : objects) { 
       List<String> record = new ArrayList<String>(); 

       record.add(object.getValue1().toString()); 
       record.add(object.getValue2().toString()); 
       record.add(object.getValue3().toString()); 

       csvFilePrinter.printRecord(record); 
      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       fileWriter.flush(); 
       fileWriter.close(); 
       csvFilePrinter.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
Questions connexes