2010-06-06 32 views
5

Czytam 2 pliki CSV: store_inventory & new_acquisitions.
Chcę móc porównać plik CSV store_inventory z new_acquisitions. 1) Jeśli nazwy pozycji pasują, zaktualizuj tylko ilość w store_inventory. 2) Jeśli nowe_kady mają nowy element, który nie istnieje w store_inventory, dodaj go do store_inventory.Java: odczyt i zapis pliku CSV

Oto, co zrobiłem do tej pory, ale jest niezbyt dobra. Dodałem komentarze, w których muszę dodać zadanie: & .
Każda rada lub kod służący do wykonywania powyższych zadań będzie świetny! dzięki.

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 

    } 

Jeszcze raz dziękuję za pomoc. =]

+1

Znajdziesz masz coraz lepsze odpowiedzi, jeśli rzeczywiście zadać pytanie. –

Odpowiedz

5

Sugerujemy użycie jednego z istniejących parsera CSV, takiego jak Commons CSV lub Super CSV zamiast ponownego wymyślania koła. Powinno ułatwić ci życie.

+0

Pobrałem opencsv, ale nie mam pojęcia, jak korzystać z biblioteki. Czy możesz wskazać mi właściwy kierunek, proszę. Używam netbeans – nubme

+0

Przykłady na czytanie i pisanie z opencsv, patrz http://opencsv.sourceforge.net/#how-to-read – seangrieve

1

Wykonana operacja będzie wymagać, aby dla każdej pozycji w nowych nabyciach konieczne było przeszukanie każdego elementu w ekwipunku pod kątem dopasowania. Jest to nie tylko nieefektywne, ale skaner skonfigurowany dla pliku zasobów musiałby zostać zresetowany po każdym elemencie.

Sugeruję dodanie nowych zakupów i zasobów do kolekcji, a następnie powtórzenie nowych zakupów i wyszukanie nowego elementu w kolekcji zasobów reklamowych. Jeśli element istnieje, zaktualizuj element. Jeśli nie, dodaj go do kolekcji zasobów. W przypadku tego działania może być dobrze napisać prostą klasę, która będzie zawierała element magazynu. Może być stosowany zarówno do nowych zakupów, jak i do inwentaryzacji. Aby uzyskać szybkie wyszukiwanie, sugeruję użycie HashSet lub HashMap do kolekcji zasobów.

Po zakończeniu procesu nie zapomnij o zachowaniu zmian w pliku zasobów.

3

Twoja implementacja sprawia, że ​​często popełniamy błąd polegający na przełamywaniu linii na przecinkach za pomocą line.split(","). To nie działa, ponieważ same wartości mogą zawierać przecinki. Jeśli tak się stanie, należy podać wartość i zignorować przecinki w cudzysłowach. Metoda split nie może tego zrobić - często widzę ten błąd.

Oto źródło implementacji że robi to poprawnie: http://agiletribe.wordpress.com/2012/11/23/the-only-class-you-need-for-csv-files/

1

jak Java nie obsługuje parsowania plików CSV natywnie, musimy polegać na bibliotekę strony trzeciej. Opencsv jest jedną z najlepszych dostępnych w tym celu bibliotek. Jest open source i jest dostarczany z licencją Apache 2.0, co umożliwia jej komercyjne wykorzystanie.

Tutaj, this link powinien pomóc Tobie i innym w sytuacjach!

1

Z pomocą otwartej biblioteki źródłowej uniVocity-parsers, można rozwijać z bardzo czystego kodu w następujący sposób:

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); 
     } 
    } 
} 

Tylko po to przykładowy kod wypracowałem zgodnie z własnymi wymaganiami. Zwróć uwagę, że biblioteka zapewniała uproszczony interfejs API i znaczącą wydajność podczas analizowania plików CSV.

0

Do pisania do pliku 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(); 
      } 
     } 
    }