5

私は2つのcsvファイルを読んでいます:store_inventorynew_acquisitions。csvファイルをと
比較できるようにしたい。1)アイテム名が一致する場合は、store_inventoryの数量を更新するだけです。2)new_acquisitionsにに存在しない新しいアイテムがある場合は、それをに追加します。store_inventorynew_acquisitionsstore_inventorystore_inventory

これが私がこれまでにしたことですが、あまり良くありません。タック12を追加する必要がある場所にコメントを追加しました。
上記のタスクを実行するためのアドバイスやコードは素晴らしいでしょう!ありがとう。

    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

     }

助けてくれてありがとう。=]

4

7 に答える 7

5

車輪を再発明する代わりに、Commons CSVSuper CSVなどの既存の CSV パーサーのいずれかを使用することをお勧めします。あなたの人生をずっと楽にするはずです。

于 2010-06-06T02:09:51.863 に答える
3

Your implementation makes the common mistake of breaking the line on commas by using line.split(","). This does not work because the values themselves might have commas in them. If that happens, the value must be quoted, and you need to ignore commas within the quotes. The split method can not do this -- I see this mistake a lot.

Here is the source of an implementation that does it correctly: http://agiletribe.purplehillsbooks.com/2012/11/23/the-only-class-you-need-for-csv-files/

于 2012-11-23T19:38:06.343 に答える
1

実行中の操作では、新しい取得の各アイテムについて、インベントリ内の各アイテムを一致するように検索する必要があります。これは効率的ではないだけでなく、在庫ファイル用に設定したスキャナーをアイテムごとにリセットする必要があります。

新しい取得物と在庫をコレクションに追加してから、新しい取得物を反復処理し、在庫コレクションで新しいアイテムを検索することをお勧めします。アイテムが存在する場合は、アイテムを更新します。そうでない場合は、インベントリ コレクションに追加します。このアクティビティでは、インベントリ アイテムを含む単純なクラスを作成するとよいでしょう。新規取得と在庫の両方に使用できます。すばやく検索するには、インベントリ コレクションに HashSet または HashMap を使用することをお勧めします。

プロセスの最後に、インベントリ ファイルへの変更を永続化することを忘れないでください。

于 2010-06-06T02:15:07.990 に答える
1

Java は CSV ファイルの解析をネイティブにサポートしていないため、サードパーティのライブラリに依存する必要があります。Opencsvは、この目的に利用できる最高のライブラリの 1 つです。これはオープン ソースであり、商用利用を可能にする Apache 2.0 ライセンスが付属しています。

ここで、このリンクは状況に応じてあなたや他の人を助けるはずです!

于 2012-12-22T12:29:48.457 に答える
0

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();
            }
        }
    }
于 2016-12-12T09:58:48.017 に答える
0

Apache Commons CSV api を使用できます。参考までに、このアンサー: https://stackoverflow.com/a/42198895/6549532

読み取り/書き込みの例

于 2017-02-13T07:50:41.230 に答える