- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
import java.io.FileInputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.net.*;
import java.util.List;
import com.google.common.base.Joiner;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.conf.*;
import static org.apache.poi.ss.usermodel.DateUtil.isCellDateFormatted;
public class XlsxToCsv {
private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
private XSSFSheet excelSheet;
private String outputFile;
private String defaultFS;
private List<String[]> arrayCSV = new ArrayList<>();
// Minumun amount of rows to expect
private int minRows = 5;
// Escape char for hive
private String escapeStr = "\\";
// Escape char for csv
private String separatorStr = ",";
public XlsxToCsv(String inputFile, String outputFile, String excelSheet, String defaultFS) throws IOException {
this.outputFile = outputFile;
this.defaultFS = defaultFS;
this.excelSheet = new XSSFWorkbook(new FileInputStream(inputFile)).getSheet(excelSheet);
}
public void setMinRows(int minRows) {
this.minRows = minRows;
}
public void setEscapeStr(String escapeStr) {
this.escapeStr = escapeStr;
}
public void setSeparatorStr(String separatorStr) {
this.separatorStr = separatorStr;
}
public List<String[]> getArrayCSV() {
return arrayCSV;
}
private void convertToCsv() {
Cell cell;
try {
for (Row row : excelSheet) {
int lastColumnNum = Math.max(row.getLastCellNum(), minRows);
String[] rowArray = new String[lastColumnNum];
for (int count = 0; count < lastColumnNum; count++) {
cell = row.getCell(count, Row.CREATE_NULL_AS_BLANK);
switch (cell.getCellType()) {
case HSSFCell.CELL_TYPE_FORMULA:
rowArray[count] = isCellDateFormatted(cell) ? dateFormat.format(cell.getDateCellValue()) : Double.toString(cell.getNumericCellValue());
break;
case Cell.CELL_TYPE_BOOLEAN:
rowArray[count] = Boolean.toString(cell.getBooleanCellValue());
break;
case Cell.CELL_TYPE_NUMERIC:
rowArray[count] = isCellDateFormatted(cell) ? dateFormat.format(cell.getDateCellValue()) : Double.toString(cell.getNumericCellValue());
break;
case Cell.CELL_TYPE_STRING:
rowArray[count] = cell.getStringCellValue().replace(separatorStr, escapeStr + separatorStr).replace("\n", " ");
break;
default:
rowArray[count] = "";
}
}
arrayCSV.add(rowArray);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void writeCsv() {
try {
FileSystem fs = FileSystem.get(new URI(defaultFS), new Configuration());
FSDataOutputStream outputStream = fs.create(new Path(outputFile));
Joiner joinEmpty = Joiner.on("").skipNulls();
Joiner joinComma = Joiner.on(separatorStr).skipNulls();
for (String[] i : arrayCSV) {
if (joinEmpty.join(i).length() > 0) {
outputStream.writeBytes(joinComma.join(i) + "\n");
}
}
outputStream.hflush();
outputStream.hsync();
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws IOException {
String inputFile = args[0];
String outputFile = args[1];
String excelSheet = args[2];
String defaultFS = args[3];
XlsxToCsv processExcelFile = new XlsxToCsv(inputFile, outputFile, excelSheet, defaultFS);
processExcelFile.convertToCsv();
processExcelFile.writeCsv();
Joiner joinEmpty = Joiner.on("").skipNulls();
Joiner joinComma = Joiner.on(",").skipNulls();
for (String[] record : processExcelFile.getArrayCSV()) {
if (joinEmpty.join(record).length() > 0) {
System.out.print(joinComma.join(record));
System.out.print("\n");
}
}
}
}
将 xlsx 转换为 csv 时,我遇到以下错误消息:
Caused by: java.lang.OutOfMemoryError: Java heap space
at java.io.ByteArrayOutputStream.<init>(ByteArrayOutputStream.java:77)
at org.apache.poi.openxml4j.util.ZipInputStreamZipEntrySource$FakeZipEntry.<init>(ZipInputStreamZipEntrySource.java:123)
at org.apache.poi.openxml4j.util.ZipInputStreamZipEntrySource.<init>(ZipInputStreamZipEntrySource.java:57)
at org.apache.poi.openxml4j.opc.ZipPackage.<init>(ZipPackage.java:93)
at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:278)
at org.apache.poi.util.PackageHelper.open(PackageHelper.java:37)
at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:274)
at acvx.agg.qwuer.excel.XlsxToCsv.<init>(XlsxToCsv.java:43)
at acvx.agg.qwuer.excel.XlsxToCsv.main(XlsxToCsv.java:135)
最佳答案
一些建议:1)我怀疑您正在逐行读取Excel,但在某些行之后可能没有数据,并且您的程序中似乎没有对此进行检查!2)我建议尝试编辑它以仅运行 50 行,您会得到一个好主意,如果您的 excel 是 250 行,它可以转换该部分。3)如果您在上面获得成功,请尝试进入读取和写入循环,当前您正在将所有内容读取到数组,然后执行下一个写入所有内容的函数。只是建议打破这个,比如读 10 并写 10。确保在此之后将变量设置为空,以便它们可用于垃圾收集4) eclipse 大小的增加取决于您机器的总 RAM,您不能超出给定机器的某个点,所以我同意这可能不一定能解决您的问题。
关于Java.lang.OutOfMemoryError : JAVA HEAP SPACE while converting xlsx to csv format. 我尝试了这个没有运气 <java-opts>-Xms400m -Xmx4096m</java-opts>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59930426/
我正在分析一个显示一些奇怪的转储:命令 !heap -x -v hexadecimal_address 之间似乎存在矛盾。和 !heap -flt s size_of_block 我正在询问悬空指针。
我试图找到免费商店通常被称为堆的官方(或足够好的)原因。 除了它从数据段的末尾增长这一事实之外,我真的想不出一个很好的理由,尤其是因为它与堆数据结构几乎没有关系。 注意:很多人提到它只是一堆无组织的东
我发现了很多 MinMax Heap 实现,它们将数据存储在一个数组中。这真的很容易实现,这就是我正在寻找不同的东西的方式。我想创建一个 MinMax 堆,只使用堆的元素和指向左 child 和右 c
Ehcache talks about堆内和堆外内存。有什么不同?使用哪些 JVM 参数来配置它们? 最佳答案 堆上存储是指将出现在 Java 堆中的对象(并且也会受到 GC)。另一方面,堆外存储是指
多年来,我一直将 !heap –p –a 用于各种任务。 现在我开始使用最新的 Win8 sdk 中的 WinDbg 6.2.9200 在 Win8 上进行调试。 在这里,我发现 !heap –p –
我试图确定为什么我的应用程序消耗 4GB 的私有(private)字节。所以我做了一个完整的内存转储,将它加载到windbg中。但是使用 !heap -stat -h 进行分析产生不加起来的奇怪结果:
我正在分析 native 内存泄漏的转储,然后我观察到“锁争用”在 !heap –s 输出中。我不记得以前见过这个。这是什么意思? 最佳答案 这是堆管理器的锁争用。高锁争用通常是由大量并发分配请求引起
突然我的应用程序崩溃并弹出这个错误...知道这个错误吗?千辛万苦还是解决不了... 将目标 GC 堆从 111MB 钳制到 96MB Alloc 并发标记扫描 GC 释放了 3(96B) 个 Allo
我需要在应用程序运行时监控 JVM 空间,我使用 JMC 进行监控,但是当我停止 tomcat 时,JMC 不工作。 我的目标是我需要验证当应用程序关闭时所有堆内存(或某些部分)是否被释放以及它释放了
我有一个内存转储。在这个转储中,我有一个句柄为 fd00000 的堆。这是 !heap -s fd00000 命令输出的摘录: 0: Heap 0fd00000 Flags 00
我正在尝试返回一系列流媒体数字的运行中位数。为此,我使用最大堆(将值存储在序列的下半部分)和最小堆(将值存储在序列的上半部分)。 特别是我使用 heapq 模块 ( https://docs.pyth
我知道 Android 平台中有 Dalvik(JVM) 堆和 native 堆。而且 Dalvik GC 在 native 堆上没有工作。但我不确定这是如何工作的,我的意思是 Android 操作系
-Xms是指定初始堆大小还是最小堆大小?我看到不同的观点。有些人喜欢 second answer here ,说它用于初始堆,而其他一些人说它是最小堆大小。 还是说最小尺寸本身就是初始尺寸? 最佳答案
我正在编写一个将大量联系人与 Android 联系人数据库同步的程序。对于大约 700 个联系人,下载工作正常,之后我不断收到内存堆错误,该错误调用无限数量的 GC 语句并最终重新启动手机。我正面临
我正在使用 Apache Ignite ver2.7,使用 Config.xml 设置启动 Ignite 服务器。 ./ignite.sh $IGNITE_HOME/config/config.xml
在 Eclipse IDE 中执行 Web 驱动程序脚本时,出现 Unable to execute dex: Java heap space Java heap space 错误。我已经用 Andr
我有一个带有以下参数的 Java 应用程序,但即使总可用空间大于 45%(可以通过可视化 VM 看到),堆也不会被回收。 JVM 是否有任何理由不释放该堆空间?相同的设置在 Java6 中按预期工作。
我正在查看 ASP.NET 4 应用程序(工作流服务)的性能计数器 .NET CLR Memory -- # Bytes in all Heaps : 44,420,488 .NET CLR M
CentOS Linux 发行版 7.3.1611 gcc 版本 4.8.5 20150623 gperftool 2.4-8.el7 1.my c++ 程序链接 -ltcmalloc 在没有 HEA
我创建了一个Gradle包装器 $ gradle wrapper --gradle-version 5.0 --distribution-type all ...现在有 $ ./gradlew -ve
我是一名优秀的程序员,十分优秀!