为什么我在 java 中将文本转换为 xls 文件后写入文本时输出偏移
Why I am getting shifted output when write to a text after converting it to xls file in java
我正在将已解析网页的输出写入两个文本文件。 "CrawledURLS.txt" 保存已抓取的页面,"CrawledURLSERROR.txt" 保存未抓取的页面。因为我应该得到一些输出数据图,所以我将 .txt 文件转换为 .xls 文件。我收到了超过“300.000”个 URL。当我停止程序检查输出时,我看到一些列向右移动或包含不正确的信息。
这里是我写输出的地方:
LinkNode deque(){
LinkNode link = pQUEUE.poll();
link.setDequeTime(new DateTime());
for (LinkNode l : pQUEUE) {
DateTime start = new DateTime();
l.setDequeTime(start);
l.setStartTime(start);
PingTaskManager.ping(l);
if(l.getStatus()!= null && l.getStatus().equals(LinkNodeStatus.OK)) {
try (PrintWriter out = new PrintWriter (new BufferedWriter (new FileWriter("CrawledURLS.txt",true)))){
l.setEndTime(new DateTime());
out.println( l.getUrl() + ": "+ l.getWeight() + " InTime: "+
Util.formatDate(l.getDequeTime()) + " OutTime: " + Util.formatDate(l.getEnqueTime())+" Waiting duration :" + l.waitingInQueue()
+ " Processing duration :" + l.linkProcessingDuration() );
} catch(IOException e){
}
} else {
try (PrintWriter out = new PrintWriter (new BufferedWriter (new FileWriter("CrawledURLSERROR.txt",true)))){
l.setEndTime(new DateTime());
out.println( l.getUrl() + ": "+ l.getWeight() + " InTime : "+
Util.formatDate(l.getDequeTime()) + " OutTime : " + Util.formatDate(l.getEnqueTime())+" Waiting duration :" + l.waitingInQueue()
+ " Processing duration :" + l.linkProcessingDuration() );
} catch(IOException e){
}
}
}
return link;
}
这是我得到的输出:
关于这个问题我有两个问题:
1- 为什么要进行这种损坏?
2- 如何将我的代码转换为使用 .csv 文件而不是 .txt 文件输出?这会解决问题吗?
很有可能写入 CSV 文件会解决这个问题,因为看来问题是 Excel 猜测如何将文本数据放入列中。
请注意,CSV 不是标准。 CSV 格式因程序而异,例如如何引用,是否可以引用换行
因此使用经过调试的 CSV 库,例如 Apache 库 https://commons.apache.org/proper/commons-csv/,并将其设置为 Excel 写入数据。
此外,不要(重新)打开每个输出行一次的输出文件。这可能会导致问题,而且肯定会很慢。相反,打开两个输出文件,向每个文件写入一个 header 行(给出列名),然后遍历数据,添加数据值行,最后关闭文件。
(如果 CSV 引用不能满足您的数据需求,您可以切换到 well-defined 标准,例如 JSON 或 XML。)
我正在将已解析网页的输出写入两个文本文件。 "CrawledURLS.txt" 保存已抓取的页面,"CrawledURLSERROR.txt" 保存未抓取的页面。因为我应该得到一些输出数据图,所以我将 .txt 文件转换为 .xls 文件。我收到了超过“300.000”个 URL。当我停止程序检查输出时,我看到一些列向右移动或包含不正确的信息。
这里是我写输出的地方:
LinkNode deque(){
LinkNode link = pQUEUE.poll();
link.setDequeTime(new DateTime());
for (LinkNode l : pQUEUE) {
DateTime start = new DateTime();
l.setDequeTime(start);
l.setStartTime(start);
PingTaskManager.ping(l);
if(l.getStatus()!= null && l.getStatus().equals(LinkNodeStatus.OK)) {
try (PrintWriter out = new PrintWriter (new BufferedWriter (new FileWriter("CrawledURLS.txt",true)))){
l.setEndTime(new DateTime());
out.println( l.getUrl() + ": "+ l.getWeight() + " InTime: "+
Util.formatDate(l.getDequeTime()) + " OutTime: " + Util.formatDate(l.getEnqueTime())+" Waiting duration :" + l.waitingInQueue()
+ " Processing duration :" + l.linkProcessingDuration() );
} catch(IOException e){
}
} else {
try (PrintWriter out = new PrintWriter (new BufferedWriter (new FileWriter("CrawledURLSERROR.txt",true)))){
l.setEndTime(new DateTime());
out.println( l.getUrl() + ": "+ l.getWeight() + " InTime : "+
Util.formatDate(l.getDequeTime()) + " OutTime : " + Util.formatDate(l.getEnqueTime())+" Waiting duration :" + l.waitingInQueue()
+ " Processing duration :" + l.linkProcessingDuration() );
} catch(IOException e){
}
}
}
return link;
}
这是我得到的输出:
关于这个问题我有两个问题:
1- 为什么要进行这种损坏?
2- 如何将我的代码转换为使用 .csv 文件而不是 .txt 文件输出?这会解决问题吗?
很有可能写入 CSV 文件会解决这个问题,因为看来问题是 Excel 猜测如何将文本数据放入列中。
请注意,CSV 不是标准。 CSV 格式因程序而异,例如如何引用,是否可以引用换行
因此使用经过调试的 CSV 库,例如 Apache 库 https://commons.apache.org/proper/commons-csv/,并将其设置为 Excel 写入数据。
此外,不要(重新)打开每个输出行一次的输出文件。这可能会导致问题,而且肯定会很慢。相反,打开两个输出文件,向每个文件写入一个 header 行(给出列名),然后遍历数据,添加数据值行,最后关闭文件。
(如果 CSV 引用不能满足您的数据需求,您可以切换到 well-defined 标准,例如 JSON 或 XML。)