如果角色已经存在,如何防止再次创建该角色?它必须防止通过导入器和表单创建字符
How to prevent a character from being created again if it already exists? It must prevent creating characters through the importer and the form
该项目的目的是为电视节目创建和组织数据。
在这个项目中,用户可以直接导入和输入数据。数据已部署在生产环境中并处于活动状态。
如果角色已经存在(即名称已被使用),您必须防止再次创建该角色。它必须防止通过导入器和表单创建字符。
如果角色是用表格创建的,它必须显示一条错误消息,遵循与已经存在的相同格式。
根据我的理解,代码应该:
使用输入的数据并扫描第 1 列(角色名称)并使用 while 循环(也许?)查看它是否已经存在。
如果它确实存在,代码应该输出:“Error this character exists”
如果输入的数据不存在,则会将其添加到现有数据中。
到目前为止,我已经编写了以下代码来读取有效的 csv 文件:
编辑:多亏了 Pleft 爵士,我用下面的代码让它工作:
package com.openCSV.mavenproject;
import com.opencsv.bean.CsvToBeanBuilder;
import com.opencsv.bean.StatefulBeanToCsv;
import com.opencsv.bean.StatefulBeanToCsvBuilder;
import com.opencsv.exceptions.CsvDataTypeMismatchException;
import com.opencsv.exceptions.CsvRequiredFieldEmptyException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.List;
public class Main {
public static void main(String[] args) throws IllegalStateException, IOException, CsvDataTypeMismatchException, CsvRequiredFieldEmptyException {
// TODO Auto-generated method stub
String inputName = "John"; //this is your input
String file = "/Users/apple/eclipse-workspace/Test/data/characters.csv";
//Convert CSV to bean
List<Character> characters = new CsvToBeanBuilder(new FileReader(file))
.withType(Character.class)
.withSkipLines(1)
.build()
.parse();
characters.forEach(System.out::println);
boolean anyMatch = characters.stream().anyMatch(character -> character.getName().equals(inputName));
if (anyMatch) {
System.out.println("Error this character exists");
} else {
Character character = new Character();
character.setName(inputName);
characters.add(character);
Writer writer = new FileWriter(file);
StatefulBeanToCsv beanToCsv = new StatefulBeanToCsvBuilder(writer).build();
beanToCsv.write(characters);
writer.close();
}
}
}
现在我的问题是当我 运行 上述代码时,我收到以下错误消息:
Exception in thread "main" java.lang.RuntimeException: Error parsing CSV line: 1036, values:
at com.opencsv.bean.CsvToBean.parse(CsvToBean.java:376)
at com.openCSV.mavenproject.Main.main(Main.java:31)
Caused by: com.opencsv.exceptions.CsvMalformedLineException: Unterminated quoted field at end of CSV line. Beginning of lost text: [
]
at com.opencsv.CSVReader.readNext(CSVReader.java:355)
at com.opencsv.bean.CsvToBean.submitAllBeans(CsvToBean.java:296)
at com.opencsv.bean.CsvToBean.parse(CsvToBean.java:357)
... 1 more
它指定了第 1036 行,但是我的 CSV 文件最多只有第 1035 行
所以我认为该程序有效?到达我的 csv 的末尾,然后不知道该怎么做。
我如何编辑我的代码以使其在 csv 文件完成后中断?
如果你的项目是 maven 那么你可以添加 OpenCSV 库来帮助你
在您的 pom.xml
中添加以下依赖项:
<dependency>
<groupId>com.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>5.3</version>
</dependency>
然后创建 Character
class 来保存一行 CSV。为了方便起见,我只添加了 name
和 description
字段,您也可以添加其他字段,或者您可以根据需要保留 name
字段。
public class Character {
@CsvBindByPosition(position = 0)
private String name;
@CsvBindByPosition(position = 1)
private String description;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
这里有一些代码可以执行您的要求:通读 csv 文件,如果找到与给定输入匹配的名称,则会打印错误,否则会将其添加到 csv 文件中。
String inputName = "John"; //this is your input
List<Character> characters = new CsvToBeanBuilder(new FileReader("D:\characters.csv"))
.withType(Character.class)
.withSkipLines(1)
.build()
.parse();
characters.forEach(System.out::println);
boolean anyMatch = characters.stream().anyMatch(character -> character.getName().equals(inputName));
if (anyMatch) {
System.out.println("Error this character exists");
} else {
Character character = new Character();
character.setName(inputName);
characters.add(character);
Writer writer = new FileWriter("D:\characters.csv");
StatefulBeanToCsv beanToCsv = new StatefulBeanToCsvBuilder(writer).build();
beanToCsv.write(characters);
writer.close();
}
该项目的目的是为电视节目创建和组织数据。
在这个项目中,用户可以直接导入和输入数据。数据已部署在生产环境中并处于活动状态。
如果角色已经存在(即名称已被使用),您必须防止再次创建该角色。它必须防止通过导入器和表单创建字符。
如果角色是用表格创建的,它必须显示一条错误消息,遵循与已经存在的相同格式。
根据我的理解,代码应该:
使用输入的数据并扫描第 1 列(角色名称)并使用 while 循环(也许?)查看它是否已经存在。
如果它确实存在,代码应该输出:“Error this character exists”
如果输入的数据不存在,则会将其添加到现有数据中。
到目前为止,我已经编写了以下代码来读取有效的 csv 文件:
编辑:多亏了 Pleft 爵士,我用下面的代码让它工作:
package com.openCSV.mavenproject;
import com.opencsv.bean.CsvToBeanBuilder;
import com.opencsv.bean.StatefulBeanToCsv;
import com.opencsv.bean.StatefulBeanToCsvBuilder;
import com.opencsv.exceptions.CsvDataTypeMismatchException;
import com.opencsv.exceptions.CsvRequiredFieldEmptyException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.List;
public class Main {
public static void main(String[] args) throws IllegalStateException, IOException, CsvDataTypeMismatchException, CsvRequiredFieldEmptyException {
// TODO Auto-generated method stub
String inputName = "John"; //this is your input
String file = "/Users/apple/eclipse-workspace/Test/data/characters.csv";
//Convert CSV to bean
List<Character> characters = new CsvToBeanBuilder(new FileReader(file))
.withType(Character.class)
.withSkipLines(1)
.build()
.parse();
characters.forEach(System.out::println);
boolean anyMatch = characters.stream().anyMatch(character -> character.getName().equals(inputName));
if (anyMatch) {
System.out.println("Error this character exists");
} else {
Character character = new Character();
character.setName(inputName);
characters.add(character);
Writer writer = new FileWriter(file);
StatefulBeanToCsv beanToCsv = new StatefulBeanToCsvBuilder(writer).build();
beanToCsv.write(characters);
writer.close();
}
}
}
现在我的问题是当我 运行 上述代码时,我收到以下错误消息:
Exception in thread "main" java.lang.RuntimeException: Error parsing CSV line: 1036, values:
at com.opencsv.bean.CsvToBean.parse(CsvToBean.java:376)
at com.openCSV.mavenproject.Main.main(Main.java:31)
Caused by: com.opencsv.exceptions.CsvMalformedLineException: Unterminated quoted field at end of CSV line. Beginning of lost text: [
]
at com.opencsv.CSVReader.readNext(CSVReader.java:355)
at com.opencsv.bean.CsvToBean.submitAllBeans(CsvToBean.java:296)
at com.opencsv.bean.CsvToBean.parse(CsvToBean.java:357)
... 1 more
它指定了第 1036 行,但是我的 CSV 文件最多只有第 1035 行
所以我认为该程序有效?到达我的 csv 的末尾,然后不知道该怎么做。
我如何编辑我的代码以使其在 csv 文件完成后中断?
如果你的项目是 maven 那么你可以添加 OpenCSV 库来帮助你
在您的 pom.xml
中添加以下依赖项:
<dependency>
<groupId>com.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>5.3</version>
</dependency>
然后创建 Character
class 来保存一行 CSV。为了方便起见,我只添加了 name
和 description
字段,您也可以添加其他字段,或者您可以根据需要保留 name
字段。
public class Character {
@CsvBindByPosition(position = 0)
private String name;
@CsvBindByPosition(position = 1)
private String description;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
这里有一些代码可以执行您的要求:通读 csv 文件,如果找到与给定输入匹配的名称,则会打印错误,否则会将其添加到 csv 文件中。
String inputName = "John"; //this is your input
List<Character> characters = new CsvToBeanBuilder(new FileReader("D:\characters.csv"))
.withType(Character.class)
.withSkipLines(1)
.build()
.parse();
characters.forEach(System.out::println);
boolean anyMatch = characters.stream().anyMatch(character -> character.getName().equals(inputName));
if (anyMatch) {
System.out.println("Error this character exists");
} else {
Character character = new Character();
character.setName(inputName);
characters.add(character);
Writer writer = new FileWriter("D:\characters.csv");
StatefulBeanToCsv beanToCsv = new StatefulBeanToCsvBuilder(writer).build();
beanToCsv.write(characters);
writer.close();
}