首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CSVReader不检查整个文件

CSVReader不检查整个文件
EN

Stack Overflow用户
提问于 2017-09-25 12:06:08
回答 1查看 513关注 0票数 2

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

问题是,读取器只检查我文件的第一列,而不是整个文件。创建时,该文件只包含一个标头,而不包含其他任何内容。程序将检查每一列,如果sudoID不同,它将将其写入文件。如果第一行中的sudoID等于从我的主类导入的那个,它将识别它,而不是写它。但是,如果这个-相同- sudoID在第二行,它将不会识别它,并将再次写入它。

例如,如果我的CSV看起来像这样,它就会工作:

代码语言:javascript
复制
"Patient_id Pseudo_ID",
"32415","PAT106663926"

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

代码语言:javascript
复制
"Patient_id Pseudo_ID",
"32416","PAT104958880"
"32415","PAT106663926"

谢谢!我的守则:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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 +  "]";
   }

}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-25 12:32:49

让我们检查一下您的for loop

代码语言:javascript
复制
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;
      }
  }

因此,在您提到的情况下,它不像预期的那样工作,这意味着与您的输入相匹配的行是第二行:

代码语言:javascript
复制
"Patient_id Pseudo_ID",
"32416","PAT104958880"
"32415","PAT106663926"

因此,您可以调用:getID("32415", "PAT106663926")循环中发生的情况是:

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

我认为这是一个错误,在您的for loop中,如果有匹配,您应该检查all条目,然后创建病人并将其存储到csv。

举个例子:

代码语言:javascript
复制
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();

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46404835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档