考虑一个csv文件(emp.csv)。我的想法是输出行和列交集的数据。我提供了选择行的复选框。我没有得到如何选择列,然后从选定的行和列输出数据。emp.csv的字段 [id,first_name,last_name,email,gender]
//CSVReaderUtility
package com.query.generator;
import java.util.List;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;
public class CSVReaderUtility {
private static final char DEFAULT_SEPARATOR = ',';
private static final char DEFAULT_QUOTE = '"';
public List<Employee> getEmps() throws FileNotFoundException {
List<Employee> emps = new ArrayList<>();
String csvFile = "emp.csv";
Scanner scanner = new Scanner(new File(csvFile));
while (scanner.hasNext()) {
List<String> line = parseLine(scanner.nextLine());
Employee emp = new Employee();
emp.setId(line.get(0));
emp.setFirst_name(line.get(1));
emp.setLast_name(line.get(2));
emp.setEmail(line.get(3));
emp.setGender(line.get(4));
emp.setMobile(line.get(5));
emp.setSalary(line.get(6));
emps.add(emp);
}
System.out.println("Size of the employees : " + emps.size());
scanner.close();
return emps;
}
public static List<String> parseLine(String cvsLine) {
return parseLine(cvsLine, DEFAULT_SEPARATOR, DEFAULT_QUOTE);
}
public static List<String> parseLine(String cvsLine, char separators) {
return parseLine(cvsLine, separators, DEFAULT_QUOTE);
}
public static List<String> parseLine(String cvsLine, char separators, char customQuote) {
List<String> result = new ArrayList<>();
// if empty, return!
if (cvsLine == null && cvsLine.isEmpty()) {
return result;
}
if (customQuote == ' ') {
customQuote = DEFAULT_QUOTE;
}
if (separators == ' ') {
separators = DEFAULT_SEPARATOR;
}
StringBuffer curVal = new StringBuffer();
boolean inQuotes = false;
boolean startCollectChar = false;
boolean doubleQuotesInColumn = false;
char[] chars = cvsLine.toCharArray();
for (char ch : chars) {
if (inQuotes) {
startCollectChar = true;
if (ch == customQuote) {
inQuotes = false;
doubleQuotesInColumn = false;
} else {
// Fixed : allow "" in custom quote enclosed
if (ch == '\"') {
if (!doubleQuotesInColumn) {
curVal.append(ch);
doubleQuotesInColumn = true;
}
} else {
curVal.append(ch);
}
}
} else {
if (ch == customQuote) {
inQuotes = true;
// Fixed : allow "" in empty quote enclosed
if (chars[0] != '"' && customQuote == '\"') {
curVal.append('"');
}
// double quotes in column will hit this!
if (startCollectChar) {
curVal.append('"');
}
} else if (ch == separators) {
result.add(curVal.toString());
curVal = new StringBuffer();
startCollectChar = false;
} else if (ch == '\r') {
// ignore LF characters
continue;
} else if (ch == '\n') {
// the end, break!
break;
} else {
curVal.append(ch);
}
}
}
result.add(curVal.toString());
return result;
}
}
// index.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ page import="java.util.List"%>
<%@ page import="com.query.generator.*"%>
<%
List<Employee> eList = null;
CSVReaderUtility utility = new CSVReaderUtility();
eList = utility.getEmps();
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Employee Details</title>
</head>
<body>
<form action="/generate" method="post">
<table>
<tr>
<td>
<td><input type="checkbox" name="col" value="id"></td>
<td><input type="checkbox" name="col" value="first_name"></td>
<td><input type="checkbox" name="col" value="last_name"></td>
<td><input type="checkbox" name="col" value="email"></td>
<td><input type="checkbox" name="col" value="gender"></td>
<td><input type="checkbox" name="col" value="mobile"></td>
<td><input type="checkbox" name="col" value="salary"></td>
</tr>
<%
for (Employee ee : eList) {
%>
<tr>
<%
String data = "";
// 123,john,123123,eny
// 2354 ,krishna,44444,msn
StringBuffer buffer = new StringBuffer();
buffer.append(ee.getId()).append(",");
buffer.append(ee.getFirst_name()).append(",");
buffer.append(ee.getLast_name()).append(",");
buffer.append(ee.getEmail()).append(",");
buffer.append(ee.getGender()).append(",");
buffer.append(ee.getMobile()).append(",");
buffer.append(ee.getSalary());
data = buffer.toString();
%>
<td><input type="checkbox" name="row" value=<%=data%>></td>
<td><%=ee.getId()%></td>
<td><%=ee.getFirst_name()%></td>
<td><%=ee.getLast_name()%></td>
<td><%=ee.getEmail()%></td>
<td><%=ee.getGender()%></td>
<td><%=ee.getMobile()%></td>
<td><%=ee.getSalary()%></td>
</tr>
<%
}
%>
</table>
<input type="submit" value="generate"/>
</form>
</body>
</html>
答案 0 :(得分:1)
我不确定,你真正想要的是什么。最终目标。 但我会尽力帮助。
我看到你有一个id字段的CSV文件。然后可以通过其id识别/选择每一行。
CSVReaderUtility
而不是在行中的CSVReaderUtility getEmps()方法中创建一个List:
List<Employee> emps = new ArrayList<>();
//...
emps.add(emp);
你可以使用密钥id创建一个地图。像这样:
Map<String,Employee> emps = new HashMap<String,Employee>();
//...
emps.put(emp.getId(), emp);
这将使以后的线路更容易访问。
JSP
你的JSP表单动作转到映射到“/ generate”的Servlet。在此Servlet中,您可以在地图中再次读取相同的CSV文件,并仅使用提交的ID访问整行。无需提交全行数据 具体来说,我的意思是:
<%
String data = "";
// 123,john,123123,eny
// 2354 ,krishna,44444,msn
StringBuffer buffer = new StringBuffer();
buffer.append(ee.getId()).append(",");
buffer.append(ee.getFirst_name()).append(",");
buffer.append(ee.getLast_name()).append(",");
buffer.append(ee.getEmail()).append(",");
buffer.append(ee.getGender()).append(",");
buffer.append(ee.getMobile()).append(",");
buffer.append(ee.getSalary());
data = buffer.toString();
%>
<td><input type="checkbox" name="row" value=<%=data%>></td>
可以替换为:
<td><input type="checkbox" name="employeeId" value=<%=ee.getId()%>></td>
而不是在第一个表格中输入标签
<td><input type="checkbox" name="col" value="id"></td>
<td><input type="checkbox" name="col" value="first_name"></td>
<td><input type="checkbox" name="col" value="last_name"></td>
<td><input type="checkbox" name="col" value="email"></td>
<td><input type="checkbox" name="col" value="gender"></td>
<td><input type="checkbox" name="col" value="mobile"></td>
<td><input type="checkbox" name="col" value="salary"></td>
你可以只有像
这样的普通文字 <td>id</td>
...
<td>salary</td>
重要的部分是为了获得列的值
代码
<td><%=ee.getId()%></td>
<td><%=ee.getFirst_name()%></td>
<td><%=ee.getLast_name()%></td>
<td><%=ee.getEmail()%></td>
<td><%=ee.getGender()%></td>
<td><%=ee.getMobile()%></td>
<td><%=ee.getSalary()%></td>
可以替换为
...
<td><input type="text" name="salary" value="<%=ee.getSalary()%>"></td>
但就像已经说过的那样。 id应该足以在servlet中进一步处理。
此外,表格可以分为多种形式。每个csv行一个表单。
您可以使用表达式语言和jstl迭代而不是scriptlet <% %>
它使JSP更易于维护
在这里,您可以阅读how to generate JSP Content from map with EL and JSTL
答案是关于从属性文件加载数据,但CSV文件是相同的。