這幾乎可行。 (需要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。如果沒有人提出更好的答案,也許你可以用它作爲骨架來構建你的項目。
作爲替代,這裏有一個批次的JScript +通曉這比PowerShell的方法效率更好,雖然這是更長的時間。它不會承受TextFieldParser()
類所需的開銷,並且JScript通常比PowerShell快。作爲獎勵,只要安裝了IE 9或更新的版本(Vista SP2我認爲?),它就可以與早期版本的Windows一起使用。如果你更喜歡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, ' '));
輸出類似,只是整數值未加引號。
你可以依靠格式? F.E.在那裏_allways_會是一個空間,例如?(8)? – Jeff
@Jeff idk,95%的空格被移除... – cryx