java - 在 Java 中将 csv 转换为 xls 时出现问题?只需要核心 Java 经验 - 问题与导入无关

标签 java csv split xls delimiter

首先,我知道我想这样进行上转换是不寻常的,但请耐心等待。我们通过网站导出获取这些 csv 文件,并且没有选择以任何其他形式获取它。

现在,回答问题:

我有这段旧代码可以为我完成这个过程。它基本上读取每一行,然后挑选 , 之间的每个值。这对于我转换的一些示例非常有效,但是当涉及到使用给定的示例时,某些值不合适。

我在 Notepad++ 中打开这些文件,并意识到某些单元格本身包含 ,。 CSV 文件通过用 " 包围这些单元格来解决此问题。请参阅下面的示例:

.

这会很好地工作:

约翰,史密斯,johnsmith@email.com,汉堡

但是,这不会:

约翰,史密斯,johnsmith@email.com,“汉堡,炸薯条”

.

不幸的是,我的代码(String strar[] = thisLine.split(",");)没有考虑到某些单元格包含逗号,并将它们分成不同的列,例如:“汉堡炸薯条”

.

如何让我的程序有效地将 " 包围的文本视为单个值,而不是两个单独的值?

.

如果我可以为你们解决任何问题,请告诉我。

非常感谢您的帮助,

贾斯汀

最佳答案

只需逐个字符检查 CSV 并在出现报价时设置切换即可。这是一个启动示例:

public static List<List<String>> parseCsv(InputStream input, char separator) 
    throws IOException 
{
    BufferedReader reader = null;
    List<List<String>> csv = new ArrayList<List<String>>();
    try {
        reader = new BufferedReader(new InputStreamReader(input, "UTF-8"));
        for (String record; (record = reader.readLine()) != null;) {
            boolean quoted = false;
            StringBuilder fieldBuilder = new StringBuilder();
            List<String> fields = new ArrayList<String>();
            for (int i = 0; i < record.length(); i++) {
                char c = record.charAt(i);
                fieldBuilder.append(c);
                if (c == '"') {
                    quoted = !quoted;
                }
                if ((!quoted && c == separator) || i + 1 == record.length()) {
                    fields.add(fieldBuilder.toString().replaceAll(separator + "$", "")
                        .replaceAll("^\"|\"$", "").replace("\"\"", "\"").trim());
                    fieldBuilder = new StringBuilder();
                }
            }
            csv.add(fields);
        }
    } finally {
        if (reader != null) try { reader.close(); } catch (IOException logOrIgnore) {}
    }
    return csv;
}

但是,您也可以直接获取任何第 3 方 Java CSV API其中可能有更多功能等等。

关于java - 在 Java 中将 csv 转换为 xls 时出现问题?只需要核心 Java 经验 - 问题与导入无关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3225108/

相关文章:

java - Mongo hadoop mapreduce 显示错误

java - 了解 AudioFormat 、 AudioInputStream 和 start 方法的构造函数

php - 在 Symfony 中设置 CsvEncoder 分隔符

json - D3.js:如何组合 2 个数据集以创建 map 并在.mouseover 上显示值?

java - 以 1024 字节的 block 分割 Java 字符串

java - 安卓。为什么 E/JavaBinder : FAILED BINDER TRANSACTION?

java - XPath/XQuery : How to retrieve all the array instead the first element when using

php - 在 PHP 中将 MySQL 数据库作为 Excel CSV 导出到桌面

javascript - 如何获得 Javascript 正则表达式匹配的字符串的实际值?

java - 用任何符号分割字符串