簡體   English   中英

在 java 中使用 openCSV 從 CSV 文件讀取並寫入新的 CSV 文件

[英]Reading from a CSV file and writing to a new CSV file using openCSV in java

我正在編寫一個讀取 CSV 文件的程序,我修改了一些列。修改后我必須將它寫入一個新的 CSV 文件並進行修改。

我已經完成了閱讀和修改,但是當我將它寫入一個新文件時,我只得到一行。我在這里感到震驚。

幫我克服這個?

我正在使用 openCSV,語言是 Java。

我的代碼:

CSVReader reader;
try 
{   
  File file=new File("/home/srinivas/Desktop/saicharan/Cardsmod.csv");
  if(file.createNewFile()){ }
  reader = new CSVReader(new FileReader(filename));
  String filewrite="/home/srinivas/Desktop/saicharan/Cardsmod.csv";   
  CSVWriter writer=new CSVWriter(new FileWriter(filewrite));
  String[] row;
  while((row = reader.readNext()) != null)
  {
    String str=new String();
    String str1=new String();
    for(int i=0;i<row.length;i++)
    {
      str1=str1+","+row[i];
      if(row[i].equals("Card Text Listen"))
      {
        String [] nextLine = reader.readNext();
        String [] nextLine1=reader.readNext();
        str=str+nextLine[i]+nextLine1[i];           
        c2.met(str);
      }
      if(i==11)
      {
        String[] rowwrite=str1.split(",");
        writer.writeNext(rowwrite);                     
      }
    }
  }
  writer.close();
}

謝謝你。

我看到您讀寫同一文件,因此您應該將所有行存儲到列表中,然后在閱讀器完成Exp后初始化編寫器:

String[] header;
        String[] row;
        int index = 0;
        // processing the header;
        header = reader.readNext();
        for (int i = 0; i < header.length; i++) {
            if (header[i].equals("Card Text Listen")) {
                index = i;
                break;
            }
        }
        // processing data
        while ((row = reader.readNext()) != null) {
            for (int i = 0; i < row.length; i++) {
                if (index == i) {
                    row[i] = "new value";
                    break;
                }
            }
            writer.writeNext(row);
        }

這是最有效的方法

public void copyCsv(){
    CSVReader reader2 = new CSVReader(new FileReader(ADDRESS_FILE));
    List<String[]> allElements = reader2.readAll();
    CSVWriter writr = new CSVWriter(new FileWriter(Path));
    writr.writeAll(allElements);
    writr.flush();
    writr.close();
}

我使用 Sham Khan 的回答制作了以下應用程序。 也許它可以為你工作。 它根據 .csv 文件中的 id 完全更新行。

@Override
public void update(String tableName, Long rowId, List<String> values) {
    List<String> select = select(tableName, rowId);
    if (!select.isEmpty()) {
        select.clear();
        select.add(String.valueOf(rowId));
        select.addAll(values);
        copyCsv(tableName, select, rowId);
    }
}

@SneakyThrows
public void copyCsv(String tableName, List<String> values, Long rowId) {
    CSVReader reader2 = new CSVReader(new FileReader(tableName + ".csv"));
    List<String[]> allElements = reader2.readAll();
    allElements.add(Math.toIntExact(rowId), values.toArray(new String[0]));
    allElements.remove(Math.toIntExact(++rowId));
    CSVWriter writer = new CSVWriter(new FileWriter(tableName + ".csv"));
    writer.writeAll(allElements);
    writer.flush();
    writer.close();
}

 @SneakyThrows
    @Override
    public List<String> select(String tableName, Long rowId) {
        PersonResponseDto personResponseDto = selectById(tableName, rowId);
        if (personResponseDto == null) {
            throw new NotFoundException();
        }
        LinkedList<String> responseValue = new LinkedList<>();
        try (BufferedReader br = new BufferedReader(new FileReader(tableName + ".csv")); CSVParser parser = CSVFormat.DEFAULT.withDelimiter(',').withHeader().parse(br)) {
            for (CSVRecord record : parser) {
                long recordNumber = record.getRecordNumber();
                if (recordNumber == rowId) {
                    Map<String, String> stringStringMap = record.toMap();
                    for (Map.Entry<String, String> m : stringStringMap.entrySet()) {
                        responseValue.add(m.getValue());
                    }
                }
            }
        }
        return responseValue;
    }

@SneakyThrows
@Override
public PersonResponseDto selectById(String tableName, Long rowId) {
    PersonResponseDto responseDto;
    File file = new File(tableName + ".csv");
    try (BufferedReader br = new BufferedReader(new FileReader(file)); CSVParser parser = CSVFormat.DEFAULT.withDelimiter(',').withHeader().parse(br)) {
        Predicate<CSVRecord> predicate = ((record) -> record.get("id").equals(String.valueOf(rowId)));
        responseDto = parser.getRecords().stream().filter(predicate).map(this::preparePersonResponseDto).findFirst().orElseThrow(NotFoundException::new);
    }
    return responseDto;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM