我试图使用openCSV打开csv文件,遍历每一列,如果userID不同,则在文件末尾写入一个新的JavaBean对。
问题是,读取器只检查我文件的第一列,而不是整个文件。创建时,该文件只包含一个标头,而不包含其他任何内容。程序将检查每一列,如果sudoID不同,它将将其写入文件。如果第一行中的sudoID等于从我的主类导入的那个,它将识别它,而不是写它。但是,如果这个-相同- 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 + "]";
}}
发布于 2017-09-25 12:32:49
让我们检查一下您的for loop
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")循环中发生的情况是:
csv病人的第一个元素,id:32416,id匹配,32415。else部分。在那里,它创建新患者(与您的csv的第二行具有相同的patID和pseudoID ),并将其存储在文件中。"32415","PAT106663926"的条目。我认为这是一个错误,在您的for loop中,如果有匹配,您应该检查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();上面的例子写得很快,只是为了让你知道需要做什么。
https://stackoverflow.com/questions/46404835
复制相似问题