我有一个四列的文本文件,想用它创建两个向量。 我打算将第一列和第二列用作混合索引。 因此,第一列和第二列为整数,第三列和第四列为double。 在FORTRAN中,它将是:
10 READ("4Column_file.txt",*,END=20)N,M,T1,T2
IG=(N*(N+1))/2+M+1
CC(IG)=T1
CS(IG)=T2
GOTO 10
20 CONTINUE
我如何使用Kotlin或Java?
输入格式为:
5 5 -0.244048470535508183D+00 -0.129800076712784507D+01
6 0 -0.468652527040705080D+01 0.000000000000000000D+00
输出将加载CC [IG]和CS [IG]矢量。
例如在第一行中:
IG=(5*(5+1))/2+5+1=21
因此CC [21] =-0.244048470535508183D + 00和CS [21] =-0.129800076712784507D + 01。
在第二行:
IG=(6*(6+1))/2+5+1=27
因此CC [27] =-0.468652527040705080D + 01和CS [27] = 0.000000000000000000D + 00
答案 0 :(得分:0)
您可以在Kotlin中这样做:
val length = 20 // Some default length
val cc = arrayOfNulls<String>(length)
val cs = mutableListOf<String>(length)
val lineRegex = "\\s+".toRegex()
File("4Column_file.txt").useLines { lineSequence ->
for (line in lineSequence) {
val (n, m, t1, t2) = line.split(lineRegex)
val nInt = n.toInt()
val mInt = m.toInt()
val ig = (nInt * (nInt+ 1)) / 2 + mInt + 1
cc[ig] = t1
cs[ig] = t2
}
}
如果您事先不知道长度,则需要先将所有行读入某个数据类。然后,您需要找到ig
的最大值,并创建该大小的数组。像这样:
data class Row(val n: Int, val m: Int, val t1: String, val t2: String) {
val ig: Int = (n * (n+ 1)) / 2 + m + 1
}
// rowList is List<Row> after parsing
val maxIdx = rowList.maxBy { it.ig }
val cc = arrayOfNulls<String>(maxIdx + 1)
val cs = arrayOfNulls<String>(maxIdx + 1)
for (row in rowList) {
cc[row.ig] = row.t1
cs[row.ig] = row.t2
}
答案 1 :(得分:0)
您可以使用类似univocity-parsers的库。有一个有关解析制表符分隔文件的教程:
https://www.univocity.com/pages/univocity_parsers_tsv.html#working-with-tsv
由于Kotlin在JVM上运行并且是100% interoperable with Java,因此您可以简单地包含univocity-parsers jar as dependency而不是自己编写-这里是Maven坐标:
<dependency>
<groupId>com.univocity</groupId>
<artifactId>univocity-parsers</artifactId>
<version>2.8.2</version>
</dependency>