如果角色已经存在,如何防止再次创建该角色?它必须防止通过导入器和表单创建字符

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. 使用输入的数据并扫描第 1 列(角色名称)并使用 while 循环(也许?)查看它是否已经存在。

  2. 如果它确实存在,代码应该输出:“Error this character exists”

  3. 如果输入的数据不存在,则会将其添加到现有数据中。

到目前为止,我已经编写了以下代码来读取有效的 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。为了方便起见,我只添加了 namedescription 字段,您也可以添加其他字段,或者您可以根据需要保留 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();
}