java - 使用 java 8 将 txt 转换为 csv 不适用于大内容

标签 java csv java-8

您好,我想将 txt 转换为 CSV 文件。在我的 txt 文件中,我使用\t 作为分隔符。 所以我的java代码如下所示

public static void main(String[] args) throws Exception {
        final Path path = Paths.get("D:\\chat-log\\output\\");
        final Path txt = path.resolve("summary_Traders_Violation_Rule2_Conversation.txt");
        final Path csv = path.resolve("Rule2.csv");
        try (
                final Stream<String> lines = Files.lines(txt);
                final PrintWriter pw = new PrintWriter(Files.newBufferedWriter(csv, StandardOpenOption.CREATE_NEW))) {
            lines.map((line) -> line.split("\t")).
                    map((line) -> Stream.of(line).collect(Collectors.joining(","))).
                    forEach(pw::println);
        }
    } 

它创建 CSV 文件时出现异常,并且 csv 文件不包含 txt 文件中的完整数据。在第 4 列值开始抛出异常时,直到第 1、2、3 列之前只有空白值是可以的。

Exception in thread "main" java.io.UncheckedIOException: java.nio.charset.MalformedInputException: Input length = 1
    at java.io.BufferedReader$1.hasNext(Unknown Source)
    at java.util.Iterator.forEachRemaining(Unknown Source)
    at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Unknown Source)
    at java.util.stream.AbstractPipeline.copyInto(Unknown Source)
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source)
    at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(Unknown Source)
    at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(Unknown Source)
    at java.util.stream.AbstractPipeline.evaluate(Unknown Source)
    at java.util.stream.ReferencePipeline.forEach(Unknown Source)
    at XPathEx.TxtToCsv.main(TxtToCsv.java:24)
Caused by: java.nio.charset.MalformedInputException: Input length = 1
    at java.nio.charset.CoderResult.throwException(Unknown Source)
    at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
    at sun.nio.cs.StreamDecoder.read(Unknown Source)
    at java.io.InputStreamReader.read(Unknown Source)
    at java.io.BufferedReader.fill(Unknown Source)
    at java.io.BufferedReader.readLine(Unknown Source)
    at java.io.BufferedReader.readLine(Unknown Source)
    ... 10 more

最佳答案

Files.lines(Path) 打开文件以 UTF-8 作为字符集进行读取,并且您的文件似乎包含一些非 UTF-8 数据。

检查您需要哪个字符集,然后使用Files.lines(Path path, Charset cs)相反。

关于java - 使用 java 8 将 txt 转换为 csv 不适用于大内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40252669/

相关文章:

java - 如何使用 uibinder 创建带有子项的 gwt 复合组件?

Python 使用列表理解读取行(csv 和 json 文件)

java.lang.NoClassDefFoundError : jdk/nashorn/api/scripting/ScriptUtils in osgi bundle

java - 使用流 API 在 Java 中按 n 个字段分组

rest - 使用 Spring Boot 和 Java 8 的非阻塞 REST

java - JAX-RS 在哪里转义响应体

java - 一条记录多行,只有第一个带有 RID

java - 将 mailx 设置为 Java SMTP 配置

java - 需要删除csv中的空列

linux - linux中的数据操作