如何使用Java 8的流接口解析文件

如何使用Java 8的流接口解析文件,第1张

读取器会按照这样的协议来读取:文件头是一个字符串列表,而记录集是一个字符串列表的列表。读取器接受一个java.io.Reader对象用为读取来源。 先从读取文件头开始。读取文件头的算法如下: - 打开资源准备读弯拦取。 - 读取第一行然后解析 - 将行按分隔符分割。 - 将该行转化成一个字符串列表后返回 下面是它的实现。

class CsvReader {

private static final String SEPARATOR = ""

private final Reader source

CsvReader(Reader source) {

this(source)

}

List<String>readHeader() {

try (BufferedReader reader = new BufferedReader(source)) {

return reader.lines()

.findFirst()

.map(line ->Arrays.asList(line.split(SEPARATOR)))

.get()

} catch (IOException e) {

throw new UncheckedIOException(e)

}

}

}

相基弯当简单,自我解释型的。类似的,创建了一个方法来读取所有的记录。读取记录的算法如下:

打开资源文件进行读取

跳过首行

用分隔符分割行。

对每行应用一个map *** 作,将行映射到一个字符串列表

下面是它的实现:

class CsvReader {

List<List<String>>readRecords() {

try (BufferedReader reader = new BufferedReader(source)) {

return reader.lines()

.substream(1)

.map(line ->Arrays.asList(line.split(separator)))

.collect(Collectors.toList())

} catch (IOException e) {

throw new UncheckedIOException(e)

}

}

}

会注意到两个方法中的map是几乎一样的搏闹闷。事实上,它可以提取到一个变量里面:

Function<String, List<String>>mapper

= line ->Arrays.asList(line.split(separator))

我写了个测试来完成整个过程。

public class CsvReaderTest {

@Test

public void readsHeader() {

CsvReader csvReader = createCsvReader()

List<String>header = csvReader.readHeader()

assertThat(header)

.contains("username")

.contains("visited")

.hasSize(2)

}

@Test

public void readsRecords() {

CsvReader csvReader = createCsvReader()

List<List<String>>records = csvReader.readRecords()

assertThat(records)

.contains(Arrays.asList("jdoe", "10"))

.contains(Arrays.asList("kolorobot", "4"))

.hasSize(2)

}

private CsvReader createCsvReader() {

try {

Path path = Paths.get("src/test/resources", "sample.csv")

Reader reader = Files.newBufferedReader(

path, Charset.forName("UTF-8"))

return new CsvReader(reader)

} catch (IOException e) {

throw new UncheckedIOException(e)

}

}

}

首先,load只适合读内容是满秩的都是数字的ascii(即行列齐备的方阵或数组)

如果你文本里的行列不整齐,譬如每行的数字个数不一样,那么不应该也无法用load读取。

建议有如下两点粗答睁:

①检查一下你的数据文本,看看是哪里的行列不齐,以及看看那是不是你想要的情况

②如果你本来就想读一堆不是行列整齐的数字,那你无法使用load或importdata这种简单的数据接口,因为它们本来就是被设计用来读岩岁整齐的举姿数据的。那么下面你可以把数据摆到excel里用xlsread读,或者用一般性的流文件接口(fopen、fscanf、fgetl等)来读取你的文本内容


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/tougao/12138078.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存