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等)来读取你的文本内容
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)