在 java 中使用 openCSV 从 CSV 文件读取并写入新的 CSV 文件
Reading from a CSV file and writing to a new CSV file using openCSV in java
我正在编写一个读取 CSV 文件的程序,我修改了一些 columns.After 修改我必须将它写入一个新的 CSV 文件并进行修改。
我已经完成阅读和修改,但是当我将它写入一个新文件时,我只是得到了一个 row.I''''' strack here.
帮我克服这个问题?
我正在使用 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();
}
谢谢。
我看到你读写同一个文件,所以你应该将所有行存储到一个列表中,然后在 reader 完成后初始化编写器
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;
}
我正在编写一个读取 CSV 文件的程序,我修改了一些 columns.After 修改我必须将它写入一个新的 CSV 文件并进行修改。
我已经完成阅读和修改,但是当我将它写入一个新文件时,我只是得到了一个 row.I''''' strack here.
帮我克服这个问题?
我正在使用 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();
}
谢谢。
我看到你读写同一个文件,所以你应该将所有行存储到一个列表中,然后在 reader 完成后初始化编写器 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;
}