java - 如何在将打印流从 XSSF XLSX2CSV 类转换为 ByteInputStream 时保留换行符?

标签 java apache-poi sax greenplum xssf

我正在使用 Java SAX 解析器从 Excel 读取数据(使用 XSSF XLSX2CSV 类)并将其加载到 Greenplum 数据库中。我正在使用以下链接中的代码:

http://svn.apache.org/repos/asf/poi/trunk/src/examples/src/org/apache/poi/xssf/eventusermodel/XLSX2CSV.java

我从上述代码中捕获 PrintStream 输出,将其转换为 ByteInputStream,然后使用 native 批量加载实用程序 - copy - 命令将其加载到 Postgres(Greenplum)。

我在 XLSX2CSV 的主要方法中修改了以下内容以捕获打印流并将其转换为字节输入流。

ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(baos, true, "UTF-8");

// The package open is instantaneous, as it should be.
try (OPCPackage p = OPCPackage.open(xlsxFile.getPath(), PackageAccess.READ)) {
XLSX2CSV xlsx2csv = new XLSX2CSV(p, ps, minColumns);
xlsx2csv.process();
System.out.println(ps);
String data = new String(baos.toByteArray(), StandardCharsets.UTF_8);
System.out.println(data);
byte[] bytes = data.getBytes("UTF8");
ByteArrayInputStream orinput = new ByteArrayInputStream(bytes);
String dbURL1 = "jdbc:postgresql://xxxxx:xxxxx/xxxxx";
String user = "xxxxxx";
String pass = "xxxxxx";
Connection GPConnection = DriverManager.getConnection(dbURL1, user, pass);

 Statement  GPsqlStatement = GPConnection.createStatement();
 String GPStgTableTrunc = "truncate test_table";
 GPsqlStatement.execute(GPStgTableTrunc);
 System.out.print("Load to Greenplum starts "+ 
  Calendar.getInstance().getTime() + "\r\n");

 CopyManager copyManager = new CopyManager((BaseConnection) GPConnection);
copyManager.copyIn("copy test_table from stdin csv",orinput);
System.out.print("Load to Greenplum ends "+ 
Calendar.getInstance().getTime() + "\r\n");

但是在转换为 ByteInputStream 期间,换行符似乎丢失了,并且在加载到 Greenplum 时出现以下错误..

错误:找不到复制元数据。这可能意味着数据中存在混合换行符类型。使用 NEWLINE 关键字可以可靠地解决此问题。 (seg40 sdw6.gphd.local:1025 pid=101588)

当我打印字符串“data”时,它似乎有换行符并且值打印正确......但是在批量加载到数据库时它不会加载。

如何在上述场景中保留换行符以便正确加载?或者,如果有一种方法可以将 printsream 转换为标准输入,那也可以。谢谢!

最佳答案

尝试:“\r\n”而不是“\n”

ByteArrayOutputStream output = new ByteArrayOutputStream();
output.write("something\r\n"".getBytes());
output.write("something\r\n"".getBytes());

ByteArrayOutputStream input = new ByteArrayInputStream(output.getBytes());
s3.putStream(input);

看起来与此类似:

ByteArrayOutputStream/InputStream losing newline characters on S3 Import

添加已在下面使用 PrintStream 尝试过的示例代码:

static void printStream() throws Exception {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        PrintStream ps = new PrintStream(baos, true, "UTF-8");
        ps.println("test 1");
        ps.println("test 2");
        ps.println("test 3");
        System.out.print(new String(baos.toByteArray()));
    }

正在打印:

test 1
test 2
test 3

关于java - 如何在将打印流从 XSSF XLSX2CSV 类转换为 ByteInputStream 时保留换行符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53165719/

相关文章:

java - 看似随机的 SAX 输出错误

android utf-8文件解析

java - 使用 GSON 解析 JAVA 中的 JSON

excel - Apache POI - 生成引用其他单元格的条件格式

java - XWPFTableCell 删除 bodyElement(表)

jaxb - 如何在 HTML 中使用 JAXB?

java - 错误如下所述

java - 使用 Mockito 和 PowerMock 验证传递给静态方法的参数

java - 整数问题

java - 如何使用同一工作簿读取和写入Excel文件(.xlsx)?