【发布时间】:2021-06-22 02:18:02
【问题描述】:
需要读取带有自定义字符串分隔符的 csv 文件,例如“|%|”。目前我正在使用 CSV 公共库,但它只允许按字符而不是字符串拆分。我更喜欢通过坚持使用 CSV 公共库进行拆分,但也对其他库开放。
【问题讨论】:
需要读取带有自定义字符串分隔符的 csv 文件,例如“|%|”。目前我正在使用 CSV 公共库,但它只允许按字符而不是字符串拆分。我更喜欢通过坚持使用 CSV 公共库进行拆分,但也对其他库开放。
【问题讨论】:
如果 CSV 文件使用不同的分隔符,而不是默认分隔符(即逗号),则可以轻松配置 CSVFormat 来处理它。 假设文件用连字符分隔:
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser;
import java.io.IOException;
import java.io.Reader;
import java.nio.file.Files;
import java.nio.file.Paths;
public class CSVReaderWithDifferentDelimiter {
public static void main(String[] args) throws IOException {
String csvFilePath = "../csvFileWithDiffDelimiter.csv";
Reader reader = Files.newBufferedReader(Paths.get(csvFilePath));
CSVFormat csvFormat = CSVFormat.newFormat('-')
.withFirstRecordAsHeader();
CSVParser csvParser = csvFormat.parse(reader);
csvParser.getRecords()
.forEach(csvRecord -> System.out.println(csvRecord.toMap()));
}
}
请注意,我们不再使用 DEFAULT CSVFormat,而是从头开始构建。我们将分隔符作为新的格式方法参数传递。记录分隔符、转义序列等其余配置将默认设置。
【讨论】:
您需要通过用户定义的分隔符(字符串而不是字符)读取 CSV 文件。在 Java 中这样做是迂回的。但是使用 SPL(一个开源 Java 包)来完成这项工作非常简单。一行代码就够了:
| A | |
|---|---|
| 1 | =file("custom.csv").import@t(;,"|%|") |
SPL 提供 JDBC 驱动程序供 Java 调用。只需将上述 SPL 脚本存储为 readcsv.splx 并在调用存储过程时在 Java 中调用它:
…
Class.forName("com.esproc.jdbc.InternalDriver");
con= DriverManager.getConnection("jdbc:esproc:local://");
st=con.prepareCall("call readcsv ()");
st.execute();
…
或者在我们执行 SQL 语句时在 Java 程序中执行 SPL 字符串:
…
st = con.prepareStatement("==file(\"custom.csv\").import@t (;,\"|%|\")");
st.execute();
…
【讨论】: