我有一個格式如下的檔案:
03.12.2020 baz;bar; bik;
04.12.2020 bar;
05.12.2020 baz;bar;bur,jojo; bik;buch; pac;
它遵循以下格式:
日期、制表符、“ ”、4 級關鍵字串列,每個關鍵字后帶有“;”,“ ” 3 級關鍵字串列,每個關鍵字后帶有“;”等。
如果具體的幅度不存在,則省略該部分,例如 ( keyword_with_magnitude_3; keyword_with_magnitude_1;another_keyword_with_magnitude_1;)
我需要將其轉換為:日期、關鍵字;震級
例如來自:
03.12.2020 baz;bar; bik;
到
03.12.2020, baz, 4
03.12.2020, bar, 4
03.12.2020, bik, 2
正則運算式^(\d\d\.\d\d\.\d\d\d\d\t)\ \ \ \ ([^\ \r] )只找到帶有“四個”的行,沒有別的
EDIT1:如果更容易,我可以將其放入 NodeJS。我不知道如何分割線,同時將日期作為每個車道的第一件事。
uj5u.com熱心網友回復:
如果您不介意運行幾個步驟,這可能會奏效:
- 運行所有后續步驟,直到沒有任何更改(假設全域替換不可用)
- 分布大小:
找: (\ )([a-zA-Z0-9] )[;,]([a-zA-Z0-9] )
代替: \1\2;\1\3
- 通過復制日期移動到每個關鍵字的新行
找: ^(\d\d\.\d\d.\d\d\d\d)(\s )(\ *)([a-zA-Z0-9] )[;,](\ *)([a-zA-Z0-9] )(.*)$
代替: \1 \3\4;\n\1 \5\6\7
- 重新格式化行以將加號作為關鍵字后面的數字(1 加號)
找: ^(\d\d\.\d\d.\d\d\d\d)(\s )(\ {1})([a-zA-Z0-9] )[;,]
代替: \1,\4,1
- 重新格式化兩個優點
找: ^(\d\d\.\d\d.\d\d\d\d)(\s )(\ {2})([a-zA-Z0-9] )[;,]
代替: \1,\4,2
- 重新格式化 3 個優點
找: ^(\d\d\.\d\d.\d\d\d\d)(\s )(\ {3})([a-zA-Z0-9] )[;,]
代替: \1,\4,3
- 重新格式化 4 個優點
找: ^(\d\d\.\d\d.\d\d\d\d)(\s )(\ {4})([a-zA-Z0-9] )[;,]
代替: \1,\4,4
您洗掉的空行:(\r?\n)(\r?\n) =>\1
僅洗掉日期的行:^(\d\d\.\d\d.\d\d\d\d)(\s*)(\r?\n)=> 無
uj5u.com熱心網友回復:
您可以使用
const text = `03.12.2020 baz;bar; bik;
04.12.2020 bar;
05.12.2020 baz;bar;bur,jojo; bik;buch; pac;`
for (const line of text.split(/[\r\n] /)) {
console.log(`=== Processing '${line}' ===`);
[_, date, data] = line.match(/^(\d{2}\.\d{2}\.\d{4}) (. )/);
const matches = data.matchAll(/(\ *)([^;,] )/g)
let magnitude = 0;
for (const m of matches) {
if (m[1].length > 0) { magnitude = m[1].length; }
const val = m[2];
console.log(`${date}, ${val}, ${magnitude}`);
}
}
注意事項:
.split(/[\r\n] /)將文本分成幾行(您可能會以不同的方式處理它,我只是假設您將輸入作為單個字串)[_, date, data] = line.match(/^(\d{2}\.\d{2}\.\d{4}) (. )/);填寫date并data使用 Group 1 和 Group 2 值:第一組捕獲資料,第二組匹配第一個空格后的任何文本(甚至可以寫為line.match(/^(\S )\s (\S.*)/);)- 由于
data包含我們需要拆分的元素,它與 匹配(\ *)([^;,] ),第 1 組現在包含零個或多個加號,第二組包含一個或多個除逗號和分號以外的字符。 - 迭代上述匹配項,
magnitude一旦第 1 組(加號)不為空,則重新分配。最終結果是日期、值和量級的串聯。
uj5u.com熱心網友回復:
找:
^(\d\d\.\d\d\.\d{4})(.*)(\t|;)(\ .*)
代替:
\1\2\3\n\1\t\4
運行 3 次
- 洗掉空行和只有日期后沒有資料的行。
找: ^(\d\d\.\d\d\.\d{4})\t(\ \ \ \ )(. )
代替: \1,\3,4
找: ^(\d\d\.\d\d\.\d{4})\t(\ \ \ )(. )
代替: \1,\3,3
找: ^(\d\d\.\d\d\.\d{4})\t(\ \ )(. )
代替: \1,\3,2
找: ^(\d\d\.\d\d\.\d{4})\t(\ )(. )
代替: \1,\3,1
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/316092.html
