我有以下格式的文本檔案://
DATASET
..... unnecessary lines.....
TIMEUNITS SECONDS
TS 0 1.98849600e 08
3.30000000e-03 1.25400000e-02 5.88000000e-03 0.00000000e 00 0.00000000e 00
5.88000000e-03 3.33000000e-03 2.16000000e-03 0.00000000e 00 0.00000000e 00
TS 0 1.98853209e 08
0.00000000e 00 0.00000000e 00 0.00000000e 00 0.00000000e 00 0.00000000e 00
1.25400000e-02 5.88000000e-03 3.33000000e-03 0.00000000e 00 0.00000000e 00
TS 0 1.98860419e 08
3.33000000e-03 2.16000000e-03 1.08000000e-03 0.00000000e 00 0.00000000e 00
0.00000000e 00 0.00000000e 00 0.00000000e 00 0.00000000e 00 0.00000000e 00
TS 0 1.98864081e 08
1.08000000e-03 8.70000000e-04 7.20000000e-04 0.00000000e 00 0.00000000e 00
0.00000000e 00 0.00000000e 00 0.00000000e 00 0.00000000e 00 0.00000000e 00
TS 0 1.98867619e 08
0.00000000e 00 0.00000000e 00 0.00000000e 00 0.00000000e 00 0.00000000e 00
3.33000000e-03 2.16000000e-03 1.08000000e-03 0.00000000e 00 0.00000000e 00
我還在此鏈接中附上了名為“D50.bc”的示例文本檔案:https ://drive.google.com/file/d/1P5aFC0JsRLhwuUo7JENLg03DbDJ696lk/view?usp=sharing 。
沒有列名,但可以添加列名,即 V1、V2 等。在真正的文本檔案中,每個 TS 后有 14 列和 1000 行/行。每行對應一個節點,列對應該節點的某些值(即速度/剪應力等)
我想根據時間戳(TS)將“TS 0 XXX”行下的所有資料/表提取到各個 dfs 中,以便我可以對每個 TS 進行列操作。位于第二個的 TS 值 XXXX 可以作為單獨的列添加到 dfs.xml 檔案中。下面是我在 R 中嘗試過的正則運算式,但它什么都不回傳。任何幫助都受到高度贊賞。
library(dplyr)
rm(list=ls(all=TRUE))
a <- paste0(readLines("D:/D50 python/D50.bc"), collapse = "\n")
b <- regmatches(a, gregexpr("(?s)^TS[^\n] 0.*?\n\\K.*?\n\b", a,, perl = T))[[1]]
uj5u.com熱心網友回復:
spltxt <- split(txt, cumsum(grepl("^\\s*TS 0 ", txt)))[-1]
alldat <- Map(function(S, grp) {
out <- read.table(text = S[-1], header = FALSE)
out$grp <- grp
out$node <- seq_len(nrow(out))
TS <- trimws(strsplit(S[1], "\\s ")[[1]])
out$TS <- as.numeric(TS[length(TS)])
out$TS0 <- S[1]
out
}, spltxt, seq_along(spltxt))
out <- do.call(rbind, alldat)
out
# V1 V2 V3 V4 V5 grp node TS TS0
# 1.1 0.00330 0.01254 0.00588 0 0 1 1 198849600 TS 0 1.98849600e 08
# 1.2 0.00588 0.00333 0.00216 0 0 1 2 198849600 TS 0 1.98849600e 08
# 2.1 0.00000 0.00000 0.00000 0 0 2 1 198853209 TS 0 1.98853209e 08
# 2.2 0.01254 0.00588 0.00333 0 0 2 2 198853209 TS 0 1.98853209e 08
# 3.1 0.00333 0.00216 0.00108 0 0 3 1 198860419 TS 0 1.98860419e 08
# 3.2 0.00000 0.00000 0.00000 0 0 3 2 198860419 TS 0 1.98860419e 08
# 4.1 0.00108 0.00087 0.00072 0 0 4 1 198864081 TS 0 1.98864081e 08
# 4.2 0.00000 0.00000 0.00000 0 0 4 2 198864081 TS 0 1.98864081e 08
# 5.1 0.00000 0.00000 0.00000 0 0 5 1 198867619 TS 0 1.98867619e 08
# 5.2 0.00333 0.00216 0.00108 0 0 5 2 198867619 TS 0 1.98867619e 08
演練:
cumsum(grepl(...))通過 Leadership 對資料進行分組TS 0,以便我們可以將它們拆分為單獨的矩陣:cumsum(grepl("^\\s*TS 0 ", txt)) # [1] 0 0 0 0 0 0 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5我們按這些數字拆分文本,因此
0包含所有序言;1包括第一TS 0組等等。在這種情況下,0s 對應于第一個之前的所有文本TS 0,因此我們可以使用 丟棄第一段[-1]。Map(...遍歷function(S, grp)每個編號的組并沿組計數,在這種情況下稱為五次。read.table(...)將空格分隔的數字轉換為data.frame沒有預定義列名的簡短作業。正常的幀$分配處理組和節點值,以及決議行中的時間戳數字TS 0。do.call(rbind, alldat)是將串列中的所有幀組合成單個幀的一種方法;替代方案包括dplyr::bind_rows(alldat)和data.table::rbindlist(alldat)。(所有這些都比在for回圈中迭代構建框架要好/快得多。)
假設:
- 所有矩陣組都具有相同的列數
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/360925.html
