我有多个CSV文件,每个文件都有不同数量的条目,每个条目大约有300行。
每个文件的第一行是数据标签
final JButton n15 = new JButton("=");
n15.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String num1 = n15.getText();
String global = t.getText();
t.setText(global);
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByName("JavaScript");
try {
String s = global + " = " +engine.eval(global).toString();
t.setText(s);
} catch (ScriptException e1) {
e1.printStackTrace();
}
}
});
每个文件中的其余行包含数据
Person_id, person_name, person_email, person_address, person_recruitmentID, person_comments... etc
我想摆脱引号之间的逗号。 我目前正在阅读Text :: CSV文档,但这是一个缓慢的过程。
答案 0 :(得分:1)
让我们解决这个问题: 您只能通过分割逗号来阅读CSV 。你刚刚说明了原因;逗号可能会被转义或在引号内。这些逗号完全有效,它们是数据的一部分。丢弃它们会破坏CSV中的数据。
出于这个原因以及其他原因,必须使用CSV解析库读取CSV文件。要查找哪些逗号是数据以及哪些逗号是结构,还需要使用CSV解析库解析CSV。因此,您不会通过尝试从引号内删除逗号来随时保存自己。相反,你会在修改数据的同时给自己更多的工作。您必须使用CSV解析库。
Text::CSV_XS是一个非常好,非常快的CSV解析库。它有很多功能,大部分都是你不需要的。幸运的是it has examples for doing most common actions。
例如,以下是您从名为file.csv
的文件中读取和打印每一行的方法。
use strict;
use warnings;
use autodie;
use v5.10; # for `say`
use Text::CSV_XS;
# Open the file.
open my $fh, "<", "file.csv";
# Create a new Text::CSV_XS object.
# allow_whitespace allows there to be whitespace between the fields
my $csv = Text::CSV_XS->new({
allow_whitespace => 1
});
# Read in the header line so it's not counted as data.
# Then you can use $csv->getline_hr() to read each row in as a hash.
$csv->header($fh);
# Read each row.
while( my $row = $csv->getline($fh) ) {
# Do whatever you want with the list of cells in $row.
# This prints them separated by semicolons.
say join "; ", @$row;
}