gpt4 book ai didi

java - CSVReader 不检查整个文件

转载 作者:行者123 更新时间:2023-11-30 10:25:04 31 4
gpt4 key购买 nike

我正在尝试使用 openCSV 打开一个 csv 文件,遍历每一列,如果 userID 不同,则在文件末尾写入一个新的 JavaBean 对。

问题是读者只检查我文件的第一列而不是整个文件。创建时,该文件仅包含一个标题,没有其他内容。该程序将检查每一列,如果 sudoID 不同,它会将其写入文件。如果第一行中的 sudoID 等于从我的主类导入的那个,它将识别它而不是写入它。但是如果这个 -same- sudoID 在第二行,它就不会识别它并且会重新写入它。

例如,如果我的 CSV 看起来像这样,它将起作用:

"Patient_id Pseudo_ID",
"32415","PAT106663926"

如果看起来像这样,它将重写 sudoID:

"Patient_id Pseudo_ID",
"32416","PAT104958880"
"32415","PAT106663926"

谢谢!我的代码:

public class CSVConnection {

@SuppressWarnings({ "deprecation", "resource", "rawtypes", "unchecked" })
public String getID(String sID,String pseudoID) throws IOException, CsvDataTypeMismatchException, CsvRequiredFieldEmptyException{
try {
CsvToBean csv = new CsvToBean();
String csvFilename = "CsvFile.csv";
Writer writer= new FileWriter(csvFilename,true);
CSVReader csvReader = new CSVReader(new FileReader(csvFilename),',','"',1);

ColumnPositionMappingStrategy strategy = new ColumnPositionMappingStrategy();
strategy.setType(PatientCSV.class);
String[] columns = new String[] {"patID","pseudoID"};
strategy.setColumnMapping(columns);
//Set column mapping strategy
StatefulBeanToCsv<PatientCSV> bc = new StatefulBeanToCsvBuilder<PatientCSV>(writer).withMappingStrategy(strategy).build();
List patList = csv.parse(strategy, csvReader);

for (Object patObj : patList) {

PatientCSV pat = (PatientCSV) patObj;
if(((PatientCSV) patObj).getPatID().equals(sID)){

return pat.getPseudoID();
}
else
{

PatientCSV pat1 = new PatientCSV();
pat1.setPatID(sID);
pat1.setPseudoID(pseudoID);
patList.add(pat1);
/*Find a way to import it to the CSV*/
bc.write(pat1);
writer.close();
return pseudoID;
}
}


} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();

}
return null;


}




public static void main(String [] args) throws IOException, CsvDataTypeMismatchException, CsvRequiredFieldEmptyException{
CSVConnection obj = new CSVConnection();
String sID="32415";
String pseudoID="PAT101830150";
obj.getID(sID,pseudoID);
}

和 Java Bean:

public class PatientCSV {
private String patID;
private String pseudoID;


public String getPatID() {
return patID;
}


public void setPatID(String patID) {
this.patID = patID;
}


public String getPseudoID() {
return pseudoID;
}


public void setPseudoID(String pseudoID) {
this.pseudoID = pseudoID;
}


public PatientCSV(String patID, String pseudoID) {
super();
this.patID = patID;
this.pseudoID = pseudoID;
}


public PatientCSV() {
super();
// TODO Auto-generated constructor stub
}


public String toString()
{
return "Patient [id=" + patID + ", pseudoID=" + pseudoID + "]";
}

最佳答案

让我们检查一下您的 for 循环

for (Object patObj : patList) {

PatientCSV pat = (PatientCSV) patObj;
if(((PatientCSV) patObj).getPatID().equals(sID)){

return pat.getPseudoID();
}
else
{

PatientCSV pat1 = new PatientCSV();
pat1.setPatID(sID);
pat1.setPseudoID(pseudoID);
patList.add(pat1);
/*Find a way to import it to the CSV*/
bc.write(pat1);
writer.close();
return pseudoID;
}
}

所以如果你提到它没有按预期工作,这意味着与你的输入匹配的行是第二行:

"Patient_id Pseudo_ID",
"32416","PAT104958880"
"32415","PAT106663926"

所以你调用:getID("32415", "PAT106663926")你的循环中发生的是:

  1. 您获取csv 患者的第一个元素,即具有id 的元素:32416
  2. 检查它是否与作为您的方法输入的 id 32415 匹配。
  3. 它不匹配,因此转到 else 部分。它在那里创建新患者(具有与 csv 的第二行相同的 patIDpseudoID)并将其存储在文件中。
  4. 所以现在您的 csv 中应该有 2 个条目具有相同的数据 "32415","PAT106663926"

我认为这是错误,在您的 for 循环 中,您应该检查 all 条目是否匹配,然后创建患者并将其存储到csv.

一个例子:

PatientCSV foundPatient = null;
for (Object patObj : patList) {

PatientCSV pat = (PatientCSV) patObj;
if(((PatientCSV) patObj).getPatID().equals(sID)){
foundPatient = pat;
}
}

if (foundPatient == null) {
foundPatient = new PatientCSV();
foundPatient.setPatID(sID);
foundPatient.setPseudoID(pseudoID);
patList.add(foundPatient);
/*Find a way to import it to the CSV*/
bc.write(foundPatient);
writer.close();
}

return foundPatient.getPseudoID();

附言上面的例子写得很快,只是为了让你知道需要做什么。

关于java - CSVReader 不检查整个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46404835/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com