代码之家  ›  专栏  ›  技术社区  ›  Agi Hammerthief

如何指示CSVPrinter在添加记录时不写入标题行?

  •  0
  • Agi Hammerthief  · 技术社区  · 6 年前

    ControllerID,Event,Number,ReaderID,Timestamp,TransactionID, CSVPrinter 我正在使用将一行插入到同一个CSV中。但是,当打印机添加一个记录时,它会在新记录之前添加一个标题行,如下所示:

    0,1,2688229830,3,2018-09-03 13:54,63
    ControllerID,Event,Number,ReaderID,Timestamp,TransactionID
    0,1,4900920,2,2018-09-03,15:15,176492
    

    问题代码如下所示:

    /* Add an entry to the TransactionLog CSV */
    private static boolean logTransaction (
      int cid, int rid, boolean freeExit, long tsMS, long accNum, String reason
    ) {
      boolean added = false;
      int evt = freeExit ? 8 : 1;
      File transactLog = new File(Locations.getDatabaseDir(), "TransactLog.csv"),
    
      CSVFormat shortFormat = CSVFormat.DEFAULT.withQuote(null)
        .withAllowMissingColumnNames(true)/*.withTrailingDelimiter(true)*/
        .withHeader(Transaction.getHeader(false));
      // Attempt to read the last transaction ID and add 1 to it, to be used as ID of new transaction
      try (
        CSVParser shortParser = new CSVParser(new FileReader(transactLog), shortFormat);
        CSVPrinter shortWriter = new CSVPrinter(new FileWriter(transactLog, true), shortFormat);
      ) {
        // read in all the current records, getting the transactionID of the last record
        List<CSVRecord> shortRecords = shortParser.getRecords();
        int newTransId = 1;
        if (!shortRecords.isEmpty()) {
          CSVRecord last = shortRecords.get(shortRecords.size() - 1);
          String lastTransactionId = last.get("TransactionID");
          // add one to last transaction ID
          try {
            newTransId = Integer.parseInt(lastTransactionId) + 1;
          } catch (IllegalArgumentException IAEx) {
            newTransId = shortRecords.size() + 1;
            LOGGER.warn("Failed to determine last transaction ID from CSV ("
              + lastTransactionId + "); setting to recordCount (" + newTransId + ") ..."
            );
          }
        }
        // write the new transaction record
        Transaction t = new Transaction(cid, evt, accNum, rid, tsMS, newTransId, reason);
        List<String> tValues = t.asList(false), fValues = t.asList(true);
        shortWriter.printRecord(tValues);
        shortWriter.flush();
        added = true;
      } catch (IOException IOEx) {
        added = false;
        LOGGER.error(Util.getErrorTrace(
          "Failed to write transaction to \"" + transactLog.getAbsolutePath() + "\" CSV", IOEx
        ));
      }
    
      return added;
    }
    

    事务POJO的代码被省略,因为它与问题无关。

    如何防止 CSV打印机

    1 回复  |  直到 6 年前
        1
  •  6
  •   Agi Hammerthief    6 年前

    为了不输出标题行,需要添加 .withSkipHeaderRecord(true) CSVFormat CSVPrinter ,如下所示:

    CSVFormat skipFormat = CSVFormat.DEFAULT.withQuote(null)
      .withAllowMissingColumnNames(true).withTrailingDelimiter(true)
      .withHeader(Transaction.getHeader(false))
      .withSkipHeaderRecord(true).withIgnoreEmptyLines(true);
    

    呼叫 .withIgnoreEmptyLines(true) 是可选的。为了不保留空行/空行,包含了它。

    如果要将头行作为文件中的第一行输出,则可以在创建头行时进行更改 .withSkipHeaderRecord(真) .withSkipHeaderRecord(csvFile.exists()) . 这是因为文件在创建之前并不存在,但在下一次写入记录时确实存在。