我用 Kotlin 在 JavaFX 中撰寫了一個程式,我設法使 CSV 和 TXT 讀取由“;”分隔 我有效率問題,我不知道如何提高效率來進行 SQL 查詢構造。
fun generatedDelimited(filePath: String, table: String = "") {
val sourceFile = File(filePath)
var line: String?
var header: Array<String>? = null
val lines: MutableList<List<String>> = ArrayList()
try {
BufferedReader(FileReader(sourceFile)).use { br ->
header = br.readLine().split(";").toTypedArray();
while (br.readLine().also { line = it } != null) {
val values : Array<String> = line!!.split(";").toTypedArray();
lines.add(Arrays.asList(*values))
}
}
} catch (e: IOException) {
e.printStackTrace()
}
val joined = "INSERT INTO $table (${header!!.joinToString(separator = ",")})\n"
var textSelect = "${joined}SELECT * FROM ( \n"
var selectUnion = ""
var lineNo = 1
for (line in lines) {
var columnNo = 0
var comma = ", "
var select = "SELECT "
var union = "UNION ALL\n"
if (lines.size.equals(lineNo)) {
union = ""
}
for (value in line) {
if (columnNo == 1) {
select = ""
}
if (line.size.equals(columnNo 1)) {
comma = " FROM DUAL \n$union"
}
selectUnion = "$select'$value' as ${header!![columnNo]}$comma"
columnNo
}
lineNo
}
textSelect = "$selectUnion);"
querySQL.text = textSelect
}
結果:
INSERT INTO werwsf (DATA1,DATA2,DATA3,DATA4,DATA5)
SELECT * FROM (
SELECT 'HOLA1' as DATA1, 'HAKA2' as DATA2, 'HAD3' as DATA3, '' as DATA4, 'ASDAD5' as DATA5 FROM DUAL
UNION ALL
SELECT 'HOLA6' as DATA1, 'HAKA7' as DATA2, 'HAD8' as DATA3, 'FA9' as DATA4, 'ASDAD10' as DATA5 FROM DUAL
);
有沒有辦法提高效率?1600行需要5分鐘
謝謝你。
uj5u.com熱心網友回復:
這應該是您的代碼的優化版本:
我使用了 kotlin 標準的 joinToString 函式,它像 @0009laH 建議的那樣在底層使用 StringBuilder。我還洗掉了多余的串列 <-> 陣列轉換并替換了拆分,然后通過替換函式將第一行(標題)連接回來,因為它與原始代碼中的效果相同,而且速度更快。所有這些更改都應該帶來更快、更易讀和更簡潔的代碼
fun generatedDelimited(filePath: String, table: String = "") {
val sourceFile = File(filePath)
val fileLines: List<String> = sourceFile.readLines()
val header: String = fileLines.first().replace(';', ',')
val lines: List<List<String>> = fileLines.drop(1).map { line ->
line.split(";")
}
val selectUnion = lines.joinToString(separator = "UNION ALL\n") { line ->
line.withIndex().joinToString(separator = ", ", prefix = "SELECT", postfix = " FROM DUAL\n") { (columnNo, value) ->
"'$value' as ${header[columnNo]}"
}
}
querySQL.text = "INSERT INTO $table ($header)\nSELECT * FROM ( \n$selectUnion);"
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/523236.html
上一篇:我可以對一部分行重復此操作嗎?
下一篇:Python資料將行格式化為列
