当前位置: 首页 > 面试题库 >

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

赖明煦
2023-03-14
问题内容

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

现在,进入一个问题:

我有这个旧代码,可以为我完成此过程。它基本上读取每一行,然后选择,s
之间的每个值。这对于我转换的某些样本效果很好,但是当归结为使用给定的样本时,某些值就不合适了。

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

这样可以正常工作:

John,Smith,johnsmith@email.com,burgers

但是,这不会:

John,Smith,johnsmith@email.com,"burgers, french fries"

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

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

让我知道是否可以为您清除其他任何内容。

非常感谢您的帮助,

贾斯汀


问题答案:

设法回答了我自己的问题。经过一些搜索,我设法在这里找到了这个小pdf:

http://www.objectmentor.com/resources/articles/tfd.pdf

从那里,我设法采用了第35页上的代码来与我的程序一起使用。所有功劳归于Jeff Langr, 2001。我所做的就是使其与Java当前的某些标准兼容。

这是将来可能会遇到此问题的所有人员的代码。

import java.io.BufferedReader;
import java.io.IOException;
import java.util.ArrayList;

public class CSVReader {

    private BufferedReader reader;
    private String line;
    private static final String DOUBLE_QUOTE = "\"";
    private static final String COMMENT_SYMBOL = "#";
    private static final char stateINIT = 'S';
    private static final char stateCOMMENT = '#';
    private static final char stateQUOTED_DATA = 'q';
    private static final char stateQUOTE_IN_QUOTED_DATA = 'Q';
    private static final char stateDATA = 'D';
    private static final char stateNEW_TOKEN = 'N';
    private static final char stateWHITESPACE = 'W';

    public CSVReader(String filename) throws IOException {
        reader = new BufferedReader(new java.io.FileReader(filename));
        loadNextNonCommentLine();
    }

    public ArrayList<String> next() throws IOException {
        if (line == null)
            throw new IOException("Read past end of file");
        ArrayList<String> columns = columnsFromCSVRecord(line);
        loadNextNonCommentLine();
        return columns;
    }

    public boolean hasNext() {
        return line != null;
    }

    void loadNextNonCommentLine() throws IOException {
        do
            line = reader.readLine();
        while (line != null && line.startsWith(COMMENT_SYMBOL));
        if (line == null)
            reader.close();
    }

    public ArrayList<String> columnsFromCSVRecord(String line) throws IOException {
        char state = stateINIT;
        char ch;
        int i = 0;
        ArrayList<String> tokens = new ArrayList<String>();
        StringBuffer buffer = new StringBuffer();
        char[] charArray = line.toCharArray();
        while (i < charArray.length) {
            ch = charArray[i++];
            switch (state) {
            case stateINIT:
                switch (ch) {
                case '"':
                    buffer.append(ch);
                    state = stateQUOTED_DATA;
                    break;
                case ',':
                    state = stateNEW_TOKEN;
                    tokens.add(clean(buffer));
                    buffer = new StringBuffer();
                    break;
                case '\t':
                case ' ':
                    break;
                case '#':
                    state = stateCOMMENT;
                    break;
                default:
                    state = stateDATA;
                    buffer.append(ch);
                    break;
                }
                break;
            case stateCOMMENT:
                break;
            case stateQUOTED_DATA:
                switch (ch) {
                case '"':
                    buffer.append(ch);
                    state = stateQUOTE_IN_QUOTED_DATA;
                    break;
                default:
                    buffer.append(ch);
                    break;
                }
                break;
            case stateQUOTE_IN_QUOTED_DATA:
                switch (ch) {
                case '"':
                    state = stateQUOTED_DATA;
                    break;
                case ',':
                    state = stateNEW_TOKEN;
                    tokens.add(clean(buffer));
                    buffer = new StringBuffer();
                    break;
                case ' ':
                case '\t':
                    break;
                case '#':
                    tokens.add(clean(buffer));
                    state = stateCOMMENT;
                    break;
                default:
                    throw new IOException("badly formed CSV record:" + line);
                }
                break;
            case stateDATA:
                switch (ch) {
                case '#':
                    tokens.add(clean(buffer));
                    state = stateCOMMENT;
                    break;
                case ',':
                    state = stateNEW_TOKEN;
                    tokens.add(clean(buffer));
                    buffer = new StringBuffer();
                    break;
                default:
                    buffer.append(ch);
                    break;
                }
                break;
            case stateNEW_TOKEN:
                switch (ch) {
                case '#':
                    tokens.add(clean(buffer));
                    state = stateCOMMENT;
                    break;
                case ',':
                    tokens.add(clean(buffer));
                    buffer = new StringBuffer();
                    break;
                case ' ':
                case '\t':
                    state = stateWHITESPACE;
                    break;
                case '"':
                    buffer.append(ch);
                    state = stateQUOTED_DATA;
                    break;
                default:
                    state = stateDATA;
                    buffer.append(ch);
                    break;
                }
                break;
            case stateWHITESPACE:
                switch (ch) {
                case '#':
                    state = stateCOMMENT;
                    break;
                case ',':
                    state = stateNEW_TOKEN;
                    // ACCEPT NEW EMPTY COLUMN HERE??
                    break;
                case '"':
                    buffer.append(ch);
                    state = stateQUOTED_DATA;
                    break;
                case ' ':
                case '\t':
                    break;
                default:
                    state = stateDATA;
                    buffer.append(ch);
                    break;
                }
                break;
            default:
                break;
            }
        }
        if (state == stateQUOTED_DATA)
            throw new IOException("Unmatched quotes in line:\n" + line);
        if (state != stateCOMMENT)
            tokens.add(clean(buffer));
        return tokens;
    }

    public String clean(StringBuffer buffer) {
        String string = buffer.toString().trim();
        if (string.startsWith(DOUBLE_QUOTE))
            return string.substring(1, string.length() - 1);
        return string;
    }
}


 类似资料:
  • 问题内容: 这里有人知道在Java中将csv文件转换为xls或xlsx文件的任何快速,干净的方法吗? 我已经有一些东西可以管理csv文件,并且我需要与其他程序具有额外的兼容性。 除了包名称外,示例代码始终受到人们的赞赏。 非常感谢, 贾斯汀 到目前为止,这是我的代码。我需要从行中删除返回值(“ \ n”)。我的某些单元格包含多行信息(一个列表),因此我可以在csv中使用“ \ n”来表示 单元格中

  • 这篇文章很长,因为我想更好地解释上下文。 我的主要数据源是netCDF格式,我想转换成CSV文件。 有一段时间,我一直在用Python进行转换。作为一个例子,我使用一个先前修改过的netCDF数据(m 可以注意到: < li >第一行包括用逗号分隔的变量名。第二行及以上的值也用逗号分隔。 < li >纬度和经度值不四舍五入。 如上图所示,是所需的数据表示。 之后,我决定使用气候数据操作员(CDO)

  • 场景: 如下图, 红框中的数据是后台传过来的时间, 因为是一串字符串, 在 ts 中我就没办法对这个时间做处理 (例如转成数字、获取年月日等) 对应的 ts 代码 问题简述1: 我在model中定义的 createTime 和 updateTime, 都是 number 类型, 并且我在接收 res 时候已经指定接收对象是一个 Icon 类型的数组了, 但为什么我最终 res.icons[0].c

  • 问题内容: 还有其他人在导入项目时遇到问题吗?我总共有100个错误和17个警告。这在中完美运行。我按照步骤创建了Gradle构建文件。在尝试构建项目之前,没有导入错误。 我还尝试过重新下载ABS并重新下载到我的项目中。 ABS是否存在已知问题?(当然,现在是基于Android Studio的) 这是我看到的一些错误: 任何帮助真的很感激 编辑: 似乎没有使用标准IntelliJ IDEA的问题。在

  • 问题内容: 有谁知道是否有可以让我将XLS最好转换为JSON的应用程序? 我还将为CSV转换程序做准备,因为如果周围什么都没有的话,我可能最终不得不写自己。 问题答案: 这对我来说效果很好,不需要上传文件: https://github.com/cparker15/csv-to- json?files=1

  • 我遇到了一些非常奇怪的事情。当导出到CSV时,我的顶行显示引号,而下面的行显示向下。 我使用UTF8编码,并手动将双引号添加到值中,以便用引号括起来。 正在使用的代码是 在excel中显示的结果显示为(https://ibb.co/ntMYdw) 当我在记事本中打开文件时,文本显示如下。但是每行显示不同。为什么第一行显示它们,第二行不显示。记事本结果显示为(https://ibb.co/fMkWW