#java #opencsv
#java #opencsv
Вопрос:
Я должен прочитать файл CSV и рассчитать скорость заполнения каждого столбца в файле CSV. Я читаю файл CSV, который выглядит следующим образом:
Roll No, Name, Department
1 , Person1, CS
2 , Person2, CS
3 , Person3, CS
, Person4, CS
null , , null
Теперь, как мы можем видеть, столбец Roll No не содержит данных после 3-й строки, поэтому его скорость заполнения будет равна 80%
а для имени столбца скорость заполнения будет составлять 90%, потому что в 5-й строке нет данных и так далее для остальных столбцов в файле CSV.
Я хочу, чтобы результат был чем-то вроде:
{
"fillRate": [
{
"columnName": "Roll No",
"fillRate": "80%"
},
{
"columnName": "Name",
"fillRate": "90%"
},
{
"columnName": "Department",
"fillRate": "90%"
}
]
}
Ниже приведен мой код на данный момент:
readFile(String fileName){
String fullPath= fileDir "/" fileName;
int totalNumOfRows=0;
int totalNumOfRowsExcludeHeader=0;
String[] headers = null;
String[] columnsValue;
Map<String,Integer> headerAndValidRecord = new LinkedHashMap<String,Integer>();
Map<String,Integer> headerAndPercentageOfValidRecord = new LinkedHashMap<String,Integer>();
List<Map<String,String>> responeList= new ArrayList<Map<String,String>>();
try{
InputStream in = sftpConnection.get(fullPath);// getting File from server
BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8"));
String line = null;
while ((line = br.readLine()) != null){
totalNumOfRows ;
if(totalNumOfRows==1){
headers =line.split(",");
for(int h=0;h<headers.length;h ){
headerAndValidRecord.put(headers[h], 0);
}
}
else{
columnsValue =line.split(",");
for(int cV=0;cV<columnsValue.length;cV ){
if((columnsValue[cV]!=null) amp;amp; (!((columnsValue[cV].trim()).isEmpty()))){
int countOfValidRecord=0;
countOfValidRecord=headerAndValidRecord.get(headers[cV]);
countOfValidRecord=countOfValidRecord 1;
headerAndValidRecord.put(headers[cV], countOfValidRecord);
}
}//--For loop close.
}
}
totalNumOfRowsExcludeHeader=totalNumOfRows-1;
);
headerAndPercentageOfValidRecord=calculatePercentage(headerAndValidRecord,totalNumOfRowsExcludeHeader);
}catch(Exception e){
e.printStackTrace();
}
return responeList;
}
Комментарии:
1. Дорогой @GhostChat большое спасибо за вашу помощь. 🙂
2. Я ценю, что вы вернулись и улучшили свой ввод!
3. Чего все еще не хватает: пожалуйста, объясните, что, по вашему мнению, делает ваш текущий код, и где фактические результаты отличаются от ваших ожиданий. Также обратите внимание: вы должны разделять проблемы. На самом деле не имеет значения, что вы хотите создать запись JSON после вычисления этих чисел. Сосредоточьтесь на одной проблеме в данный момент. Ваша 1-я проблема: чтение данных CSV и вычисление правильных процентов. Когда это сработает, вы можете делать с этим все, что захотите. Итак, как сказано: отбросьте части, которые не имеют значения для вашего вопроса, и вместо этого объясните, чего, по вашему мнению, не хватает, и почему / где вы застряли.
Ответ №1:
почему бы вам не попробовать (total_filled / total_column) * 100.
Комментарии:
1. Вероятно, потому, что OP до сих пор не думал об этом… поскольку их код не содержит попыток подсчета значений для каждого столбца …. и обратите внимание: ваш ввод был бы нормальным комментарием, но на самом деле это не является ответом. Вам пришлось бы объяснить, как вычислять эти значения, и так далее.