在java中从行和列中选择csv文件中的数据

时间:2016-12-15 01:51:01

标签: java jsp csv

考虑一个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>

1 个答案:

答案 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文件是相同的。