2017-07-21 103 views
2

我需要和搜索結果我的.txt文件轉換爲以.json文件與格式:.TXT寫入以.json文件批量或PHP文件所需

{ 
"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:\Users\Raphael\Desktop" 
SET "destdir=D:\Users\Raphael\Desktop" 
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"} 

和遺憾,這是我第一次嘗試到文本轉換成JSON文件具有u任何想法轉換呢? :/

+0

你可以依靠格式? F.E.在那裏_allways_會是一個空間,例如?(8)? – Jeff

+0

@Jeff idk,95%的空格被移除... – cryx

回答

2

這幾乎可行。 (需要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, ' ')); 

輸出類似,只是整數值未加引號。

+0

ohw不錯,看上去很好,但我可以改變一些名字值:「Rank Kills(##)」到「Points」?我需要將殺戮作爲一個類似「殺戮」的變種:「2」不是「(2)」 – cryx

+0

@cryx使用文本編輯器並編輯源文件以擁有不同的標題和/或修改'$ parser.FieldWidths = @ 7,21,25,19,12,26,-1)'rojo爲你提供了一個好主意+1,IMO其餘的由你決定。 – LotPings

+0

@cryx我修改了腳本,添加了'-header'選項到'ConvertFrom-CSV',這也允許我將該19個字符的列分成3列(因爲現在不再嘗試複製「排名」欄目名稱)。我還添加了括號的正則表達式刪除,加上等於和值的點。它更接近,但我不確定「Score」和「Kills」標題標籤是否需要切換。 – rojo

1

只爲yucks,我使用我的JREPL.BAT utility實現了正則表達式解決方案。

我假設星號是試圖掩蓋數據,並且它們沒有出現在實際的輸入中。我假設這些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={\n\qid\q:\q$2\q,\n\qtyp\q:\q$3\q,\n\qmatch\q:" 

set "repl2= {\n" 
set "repl2=%repl2%  \qrank\q:\q$5\q,\n" 
set "repl2=%repl2%  \qplayeruserid\q:\q$6\q,\n" 
set "repl2=%repl2%  \qplayername\q:\q$7\q,\n" 
set "repl2=%repl2%  \qkills\q:\q$8\q,\n" 
set "repl2=%repl2%  \qpoints\q:\q$9\q,\n" 
set "repl2=%repl2%  \qkiller\q:\q$10\q,\n" 
set "repl2=%repl2%  \qweapon\q:\q$11\q\n" 
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" 
    } 
} 
+0

編輯 - 固定來源的「殺死」到括號內的值。 – dbenham