我需要并搜索一个结果来将我的.txt文件转换为具有该格式的 .json 文件:
{
"id":"12777475756802056",
"typ":"Solo",
"match":
{
"rank":"1",
"playeruserid":"165496871657",
"playername":"Example Name",
"kills":"8",
"points":"224000",
"killer":"empty", // while firstplace
"weapon":"empty" // while firstplace
},
{
"rank":"2",
"playeruserid":"654987654984",
"playername":"Example Name 2",
"kills":"4",
"points":"168000",
"killer":"Example Name",
"weapon":"Shotgun"
}
... another players here.
}
我的.txt文件看起来很糟糕,是的,真的很糟糕...有这么多空格,都在一行中...: https://pastebin.com/FP0C9BCj
我尝试此批处理以删除许多空格:
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET "sourcedir=D:UsersRaphaelDesktop"
SET "destdir=D:UsersRaphaelDesktop"
SET "filename1=%sourcedir%matchreport.txt"
SET "outfile=%destdir%outfile.txt"
(
FOR /f "usebackqdelims=" %%a IN ("%filename1%") DO (
SET "line=%%a"
SET "line=!line:?=!"
SET "line=!line:/=-!"
SET "line=!line::=!"
SET "line=!line: =;!"
ECHO !line!
)
)>"%outfile%"
GOTO :EOF
idk 现在为什么现在可以将其转换为 JSON 文件,而所有信息都在一行专业播放器上,并且 JSON 格式现在是:
{"1. 5605****11014 Cl***ma 205000 + 19000 ( 8) = 224000"}
抱歉,这是我第一次尝试将 TXT 转换为 JSON 文件,您有任何转换的想法吗? :/
这几乎有效。 (需要 PowerShell 3.0 或更高版本,因此需要 Windows 8 或更高版本。 这是一个批处理 + PowerShell 多语言。 使用.bat扩展名保存它。
<# : batch portion
@echo off & setlocal
set "file=test.txt"
powershell -noprofile "iex (${%~f0} | out-string)"
exit /b
: end batch / begin powershell #>
function Parse-Fields() {
add-type -as Microsoft.VisualBasic
$parser = new-object Microsoft.VisualBasic.FileIO.TextFieldParser($env:file)
$parser.TextFieldType = "FixedWidth"
$parser.TrimWhiteSpace = $true
$parser.FieldWidths = @(7, 21, 25, 6, 9, 4, 12, 26, -1)
while (!$parser.EndOfData) {
try {
$parser.ReadFields() -join "," -replace "[(+).=]" | ?{ $_ -match "d" }
}
catch {}
}
$parser.Close()
}
$header = "ID","GameUserId","Name","Rank","Kills","Score","Total","Killer","Weapon"
Parse-Fields | ConvertFrom-Csv -Header $header | ConvertTo-Json
输出:
[
{
"ID": "1",
"GameUserId": "5605****11014",
"Name": "Cl***ma",
"Rank": "205000",
"Kills": "19000",
"Score": "8",
"Total": "224000",
"Killer": "",
"Weapon": "m4"
},
{
"ID": "2",
"GameUserId": "238444****020",
"Name": "Ap*******ift",
"Rank": "172403",
"Kills": "11550",
"Score": "3",
"Total": "183953",
"Killer": "Cl***ma",
"Weapon": "m4"
},
{
"ID": "3",
"GameUserId": "92******9515",
"Name": "Sw****UK",
"Rank": "156259",
"Kills": "14900",
"Score": "6",
"Total": "171159",
"Killer": "Ap*******ift",
"Weapon": "m4"
},
{
"ID": "4",
"GameUserId": "6583833***132",
"Name": "Moc********kap",
"Rank": "144805",
"Kills": "2000",
"Score": "1",
"Total": "146805",
"Killer": "Cl***ma",
"Weapon": "shotgun"
},
{
"ID": "5",
"GameUserId": "621***7360388",
"Name": "Ol***r***",
"Rank": "135920",
"Kills": "6200",
"Score": "3",
"Total": "142120",
"Killer": "Ap*******ift",
"Weapon": "m4"
},
{
"ID": "6",
"GameUserId": "189661****980",
"Name": "Op*********gon",
"Rank": "128661",
"Kills": "0",
"Score": "0",
"Total": "128661",
"Killer": "Sw****UK",
"Weapon": "m4"
},
{
"ID": "7",
"GameUserId": "6408****79452",
"Name": "M********nner",
"Rank": "122523",
"Kills": "3500",
"Score": "2",
"Total": "126023",
"Killer": "Sw****UK",
"Weapon": "shotgun"
},
{
"ID": "8",
"GameUserId": "59060***2163",
"Name": "A***g",
"Rank": "117207",
"Kills": "0",
"Score": "0",
"Total": "117207",
"Killer": "Ap*******ift",
"Weapon": "ak"
},
{
"ID": "9",
"GameUserId": "831467****599",
"Name": "*********ngstar",
"Rank": "112517",
"Kills": "0",
"Score": "0",
"Total": "112517",
"Killer": "Ol***r***",
"Weapon": "shotgun"
},
{
"ID": "10",
"GameUserId": "34542****7961",
"Name": "********Really",
"Rank": "108322",
"Kills": "5000",
"Score": "3",
"Total": "113322",
"Killer": "[Toxic Gas]",
"Weapon": null
},
{
"ID": "11",
"GameUserId": "904****58750",
"Name": "******tch",
"Rank": "104528",
"Kills": "3500",
"Score": "2",
"Total": "108028",
"Killer": "Sw****UK",
"Weapon": "shotgun"
}
]
按摩它以满足您的要求可能不需要太多。 我更喜欢客观化数据而不是作为纯文本抓取。 该脚本首先将数据视为固定宽度的 CSV 文件。 一旦对象化为 CSV 数据,它就会转换为 JSON。 如果没有其他人提出更好的答案,也许你可以把它作为一个框架来构建你的项目。
作为替代方案,这里有一个 Batch + JScript 多语言,它比 PowerShell 方法更有效,尽管它更长。 它不会承受TextFieldParser()
类所需的开销,而且JScript通常比PowerShell更快。 作为奖励,它应该适用于早期版本的Windows,只要安装了IE版本9或更高版本(我认为是Vista SP2? 如果你对 JavaScript 更熟悉,你可能更喜欢这个。
@if (@CodeSection == @Batch) @then
@echo off & setlocal
set "file=test.txt"
cscript /nologo /e:JScript "%~f0" < "%file%"
exit /b
@end // end Batch / begin JScript
var stdin = WSH.CreateObject('Scripting.FileSystemObject').GetStandardStream(0),
file = stdin.ReadAll(),
htmlfile = WSH.CreateObject('htmlfile'),
csvfields = {"ID": 7, "GameUserId": 21, "Name": 25, "Rank": 6, "Kills": 9,
"Score": 4, "Total": 12, "Killer": 26, "Weapon": null};
String.prototype.clean = function() {
var val = this.replace(/[().+=]/g, '').replace(/^s+|s+$/g, '');
return /^d+$/.test(val) ? val * 1 : val;
}
htmlfile.write('<meta http-equiv="x-ua-compatible" content="IE=9" />');
var JSON = htmlfile.parentWindow.JSON,
lines = obj = new htmlfile.parentWindow.Array();
htmlfile.close();
lines = file.split(/r?n/g);
lines.splice(0,4);
for (var i=0; i<lines.length; i++) {
for (var field in csvfields) {
if (!obj[i]) obj.push({});
obj[i][field] = csvfields[field] ?
lines[i].substring(0, csvfields[field]).clean() : lines[i].clean();
lines[i] = lines[i].substring(csvfields[field]);
}
}
WSH.Echo(JSON.stringify(obj, null, ' '));
输出类似,只是整数值不加引号。
只是为了呀,我使用我的 JREPL.BAT 实用程序实现了一个正则表达式解决方案。
我假设星号是试图掩盖数据,并且它们不会出现在实际输入中。我假设 ID 是严格的数字。我还假设每个名称后至少有两个空格(用于表示名称的结束(。
这是我使用 JREPL.BAT 的批处理脚本:
@echo off
setlocal
:: ID Type
:: 1 2 3
set "find1=^Match ID: *(d+), *(.*?) *$"
:: Rank ID Name Kills Points Killer Weapon
:: 4 5 6 7 8 9 10 11
set "find2=^ *(d+). +(d+) +(.*S) +d+ + +d+ ( *(d+)) = *(d+) +(.*?S) +($|.*S)"
set "repl1={nqidq:q$2q,nqtypq:q$3q,nqmatchq:"
set "repl2= {n"
set "repl2=%repl2% qrankq:q$5q,n"
set "repl2=%repl2% qplayeruseridq:q$6q,n"
set "repl2=%repl2% qplayernameq:q$7q,n"
set "repl2=%repl2% qkillsq:q$8q,n"
set "repl2=%repl2% qpointsq:q$9q,n"
set "repl2=%repl2% qkillerq:q$10q,n"
set "repl2=%repl2% qweaponq:q$11qn"
set "repl2=%repl2% },"
set "find=%find1%/%find2%"
set "repl=%repl1%/%repl2%"
jrepl find repl /v /t "/" /x /a /f test.txt | jrepl "," "n}" /x /inc -1
这是伪固定的"test.txt"输入文件,删除了星号(数字或字母代替星号(。我故意在一些名字和武器上添加一个内部空间,只是为了测试我的正则表达式。
Match ID: 6549999999997461, Solo
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Rank GameUserId Name Rank Kills (##) Total Killer Weapon
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1. 5605999911014 Claaama 205000 + 19000 ( 8) = 224000 m4
2. 2384449999020 Apaaaaaaaift 172403 + 11550 ( 3) = 183953 Claaama m4
3. 929999999515 Swaa aUK 156259 + 14900 ( 6) = 171159 Apaaaaaaaift m4
4. 6583833999132 Mocaaaaaaaakap 144805 + 2000 ( 1) = 146805 Claaama shotgun
5. 6219997360388 Olaaaraaa 135920 + 6200 ( 3) = 142120 Apaaaaaaaift m4
6. 1896619999980 Opaaaaaaaaagon 128661 + 0 ( 0) = 128661 SwaaaaUK m4
7. 6408999979452 Maaaa aaanner 122523 + 3500 ( 2) = 126023 Swaa aUK shot gun
8. 590609992163 Aaaag 117207 + 0 ( 0) = 117207 Apaaaaaaaift ak
9. 8314679999599 aaaaaaaaangstar 112517 + 0 ( 0) = 112517 Olaaaraaa shotgun
10. 3454299997961 aaaaaaaaReally 108322 + 5000 ( 3) = 113322 [Toxic Gas]
11. 9049999958750 aaaa atch 104528 + 3500 ( 2) = 108028 Swaa aUK shot gun
这是最终结果:
{
"id":"6549999999997461",
"typ":"Solo",
"match":
{
"rank":"1",
"playeruserid":"5605999911014",
"playername":"Claaama",
"kills":"8",
"points":"224000",
"killer":"m4",
"weapon":""
},
{
"rank":"2",
"playeruserid":"2384449999020",
"playername":"Apaaaaaaaift",
"kills":"3",
"points":"183953",
"killer":"Claaama",
"weapon":"m4"
},
{
"rank":"3",
"playeruserid":"929999999515",
"playername":"Swaa aUK",
"kills":"6",
"points":"171159",
"killer":"Apaaaaaaaift",
"weapon":"m4"
},
{
"rank":"4",
"playeruserid":"6583833999132",
"playername":"Mocaaaaaaaakap",
"kills":"1",
"points":"146805",
"killer":"Claaama",
"weapon":"shotgun"
},
{
"rank":"5",
"playeruserid":"6219997360388",
"playername":"Olaaaraaa",
"kills":"3",
"points":"142120",
"killer":"Apaaaaaaaift",
"weapon":"m4"
},
{
"rank":"6",
"playeruserid":"1896619999980",
"playername":"Opaaaaaaaaagon",
"kills":"0",
"points":"128661",
"killer":"SwaaaaUK",
"weapon":"m4"
},
{
"rank":"7",
"playeruserid":"6408999979452",
"playername":"Maaaa aaanner",
"kills":"2",
"points":"126023",
"killer":"Swaa aUK",
"weapon":"shot gun"
},
{
"rank":"8",
"playeruserid":"590609992163",
"playername":"Aaaag",
"kills":"0",
"points":"117207",
"killer":"Apaaaaaaaift",
"weapon":"ak"
},
{
"rank":"9",
"playeruserid":"8314679999599",
"playername":"aaaaaaaaangstar",
"kills":"0",
"points":"112517",
"killer":"Olaaaraaa",
"weapon":"shotgun"
},
{
"rank":"10",
"playeruserid":"3454299997961",
"playername":"aaaaaaaaReally",
"kills":"3",
"points":"113322",
"killer":"[Toxic Gas]",
"weapon":""
},
{
"rank":"11",
"playeruserid":"9049999958750",
"playername":"aaaa atch",
"kills":"2",
"points":"108028",
"killer":"Swaa aUK",
"weapon":"shot gun"
}
}
虽然主要是一个html/xml/json数据提取工具,但Xidel也可以用一点XPath/XQuery魔法来处理原始文本。
我正在使用 dbenham 的伪固定">测试.txt"作为输入
Match ID: 6549999999997461, Solo
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Rank GameUserId Name Rank Kills (##) Total Killer Weapon
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1. 5605999911014 Claaama 205000 + 19000 ( 8) = 224000 m4
2. 2384449999020 Apaaaaaaaift 172403 + 11550 ( 3) = 183953 Claaama m4
3. 929999999515 Swaa aUK 156259 + 14900 ( 6) = 171159 Apaaaaaaaift m4
4. 6583833999132 Mocaaaaaaaakap 144805 + 2000 ( 1) = 146805 Claaama shotgun
5. 6219997360388 Olaaaraaa 135920 + 6200 ( 3) = 142120 Apaaaaaaaift m4
6. 1896619999980 Opaaaaaaaaagon 128661 + 0 ( 0) = 128661 SwaaaaUK m4
7. 6408999979452 Maaaa aaanner 122523 + 3500 ( 2) = 126023 Swaa aUK shot gun
8. 590609992163 Aaaag 117207 + 0 ( 0) = 117207 Apaaaaaaaift ak
9. 8314679999599 aaaaaaaaangstar 112517 + 0 ( 0) = 112517 Olaaaraaa shotgun
10. 3454299997961 aaaaaaaaReally 108322 + 5000 ( 3) = 113322 [Toxic Gas]
11. 9049999958750 aaaa atch 104528 + 3500 ( 2) = 108028 Swaa aUK shot gun
xidel.exe -s test.txt -e "let $line:=tokenize($raw,'rn'),$match:=extract($line[1],'^Match ID: (d+), (.+)',(1,2)) return {'id':$match[1],'type':$match[2],'match':$line[position()>4] ! (let $obj:=extract(.,'^ *(d+). +(d+) +(.*?S) .+( ?(d+)) = (d+) {3}(.*?S?.*?)? +($|.*S)',1 to 7) return {'rank':$obj[1],'playeruserid':$obj[2],'playername':$obj[3],'kills':$obj[4],'points':$obj[5],'killer':$obj[6],'weapon':$obj[7]})}"
或更具可读性(漂亮印刷(:
xidel.exe -s test.txt -e ^" ^
let $line:=tokenize( ^
$raw, ^
'rn' ^
), ^
$match:=extract( ^
$line[1], ^
'Match ID: (d+), (.+)', ^
(1,2) ^
) ^
return { ^
'id':$match[1], ^
'type':$match[2], ^
'match':$line[position()^>4] ! ( ^
let $obj:=extract( ^
., ^
'^^ *(d+). +(d+) +(.*?S) .+( ?(d+)) = (d+) {3}(.*?S?.*?)? +($^|.*S)', ^
1 to 7 ^
) return { ^
'rank':$obj[1], ^
'playeruserid':$obj[2], ^
'playername':$obj[3], ^
'kills':$obj[4], ^
'points':$obj[5], ^
'killer':$obj[6], ^
'weapon':$obj[7] ^
} ^
) ^
}^"
(每行的末尾,以及"
、>
、^
、|
都需要用^
转义(
打开">测试.txt"后,我们首先创建 2 个内部变量;$line
和$match
.$line
成为单个行的序列。$match
通过从输入的第一行中提取匹配 ID 和类型,成为匹配 ID 和类型的序列。
分配这 2 个内部变量后,我们开始创建 json。id
属性获取匹配 ID 是值,type
属性"Solo"。
接下来,我们创建match
数组并开始处理第 5 行及以上。我们提供给extract()
-function 的每一行都创建另一个内部变量(dbenham 的正则表达式略有改变(。此变量包含我们正在寻找的所有单个值的序列(7 个项目(。有了这个变量,我们最终填充了对象,在那里我们为rank
属性分配了第一项,playeruserid
属性分配了第二项,依此类推。
输出:
{
"id": "6549999999997461",
"type": "Solo",
"match": [
{
"rank": "1",
"playeruserid": "5605999911014",
"playername": "Claaama",
"kills": "8",
"points": "224000",
"killer": "",
"weapon": "m4"
},
{
"rank": "2",
"playeruserid": "2384449999020",
"playername": "Apaaaaaaaift",
"kills": "3",
"points": "183953",
"killer": "Claaama",
"weapon": "m4"
},
{
"rank": "3",
"playeruserid": "929999999515",
"playername": "SwaaaaUK",
"kills": "6",
"points": "171159",
"killer": "Apaaaaaaaift",
"weapon": "m4"
},
{
"rank": "4",
"playeruserid": "6583833999132",
"playername": "Mocaaaaaaaakap",
"kills": "1",
"points": "146805",
"killer": "Claaama",
"weapon": "shotgun"
},
{
"rank": "5",
"playeruserid": "6219997360388",
"playername": "Olaaaraaa",
"kills": "3",
"points": "142120",
"killer": "Apaaaaaaaift",
"weapon": "m4"
},
{
"rank": "6",
"playeruserid": "1896619999980",
"playername": "Opaaaaaaaaagon",
"kills": "0",
"points": "128661",
"killer": "SwaaaaUK",
"weapon": "m4"
},
{
"rank": "7",
"playeruserid": "6408999979452",
"playername": "Maaaaaaaanner",
"kills": "2",
"points": "126023",
"killer": "SwaaaaUK",
"weapon": "shotgun"
},
{
"rank": "8",
"playeruserid": "590609992163",
"playername": "Aaaag",
"kills": "0",
"points": "117207",
"killer": "Apaaaaaaaift",
"weapon": "ak"
},
{
"rank": "9",
"playeruserid": "8314679999599",
"playername": "aaaaaaaaangstar",
"kills": "0",
"points": "112517",
"killer": "Olaaaraaa",
"weapon": "shotgun"
},
{
"rank": "10",
"playeruserid": "3454299997961",
"playername": "aaaaaaaaReally",
"kills": "3",
"points": "113322",
"killer": "[Toxic Gas]",
"weapon": ""
},
{
"rank": "11",
"playeruserid": "9049999958750",
"playername": "aaaaaatch",
"kills": "2",
"points": "108028",
"killer": "SwaaaaUK",
"weapon": "shotgun"
}
]
}