将文本转换为CSV用于json反序列化
本文关键字:用于 json 反序列化 CSV 文本 转换 | 更新日期: 2023-09-27 18:14:49
我有以下内容的一个txt文件,实际上这里是原始链接:http://cdn.dota2.com/apps/570/scripts/items/items_game.9e449667cd3ba55c9c545c2a4a1825da541057b0.txt
"items"
{
"default"
{
"name" "default"
"hidden" "1"
"item_class" "dota_item_wearable"
"item_name" "#TF_Default_ItemDef"
"item_slot" "weapon"
"item_quality" "normal"
"min_ilevel" "1"
"max_ilevel" "1"
}
"20887"
{
"name" "Level 1000 Compendium"
"prefab" "misc"
"creation_date" "2015-08-14"
"expiration_date" "2016-05-01 00:00:00"
"image_inventory" "econ/tools/aegisholder"
"item_description" "#DOTA_Item_Desc_Level_1000_Compendium"
"item_name" "#DOTA_Item_Level_1000_Compendium"
"item_rarity" "immortal"
"item_type_name" "#DOTA_WearableType_Relic_of_Prestige"
"static_attributes"
{
"cannot trade"
{
"attribute_class" "cannot_trade"
"value" "1"
}
"cannot delete"
{
"attribute_class" "cannot_delete"
"value" "1"
}
}
"used_by_heroes" "0"
}
"15323"
{
"name" "Gem of Taegeuk"
"prefab" "socket_gem"
"creation_date" "2013-10-16"
"disable_style_selector" "1"
"image_inventory" "econ/tools/samtaegeuk"
"item_description" "#DOTA_Item_Desc_Gem_of_Taegeuk"
"item_name" "#DOTA_Item_Gem_of_Taegeuk"
"item_rarity" "rare"
"item_type_name" "#DOTA_WearableType_Relic_of_Prestige"
"static_attributes"
{
"gem type"
{
"attribute_class" "gem type"
"value" "3"
}
"cannot trade"
{
"attribute_class" "cannot_trade"
"value" "1"
}
"gem quality"
{
"attribute_class" "gem quality"
"value" "14"
}
}
"used_by_heroes" "0"
}
}
我正试图将其转换为CSV文件,以便我可以轻松地将CSV转换为JSON并进行反序列化,并从这个文本文件中填充属性和值,这是数据值格式。
我有下面的代码来解析txt文件:
Treenode rarities = root.Child["items_game"];
StreamWriter sw = new StreamWriter("items_game.csv");
sw.AutoFlush = true;
RecursiveReadSchema(rarities, sw, 0);
和
private static void RecursiveReadSchema(Treenode rarities, StreamWriter sw, int depth)
{
foreach(KeyValuePair<string, Treenode> n in rarities.Child)
{
//csv = "," + n.Key;
string csv = new String(',', depth) + n.Key + "'n";
if(n.Value.Data.Count > 0)
{
foreach(KeyValuePair<string, string> keyValuePair in n.Value.Data)
{
csv += Environment.NewLine + "," + keyValuePair.Key + "," + keyValuePair.Value;
}
}
sw.WriteLine(csv);
RecursiveReadSchema(n.Value, sw, depth + 1);
}
}
我的问题是"static_attributes"的一部分,它们没有放在CSV文件中的适当位置,因此它的元素。如果有人知道更好的直接将txt文件转换为JSON的方法,我也会去找,但我在网上找不到。现在,我试图解析这个文本作为treenode,然后treenode到CSV文件,从那里到JSON,从JSON到我的类。
我使用的KVParser类来自这里:http://pastebin.com/C9t3y3H7
谢谢,
编辑:
用这行:
SchemaResult schemaResult = JsonConvert.DeserializeObject<SchemaResult>(result);
这是我的类SchemaResult:
protected class SchemaResult
{
public Schema Items_game
{
get;
set;
}
}
public class Schema
{
[JsonProperty("items")]
public Dictionary<string, Item> Items
{
get;
set;
}
public class Prefabs
{
[JsonProperty("item_class")]
public int Item_Class
{
get;
set;
}
[JsonProperty("item_type_name")]
public string Item_Type_Name
{
get;
set;
}
}
public class Item
{
public string Name
{
get;
set;
}
public string Prefab { get; set; }
public string Item_Type_Name
{
get;
set;
}
public string Item_Name
{
get;
set;
}
public string item_rarity { get; set; }
public string item_description
{
get;
set;
}
public string Item_Slot
{
get;
set;
}
public PriceInfo Price_Info
{
get; set;
}
}
public class PriceInfo
{
public string category_tags
{
get;
set;
}
public int price
{
get;
set;
}
}
protected class SchemaResult
{
public Schema Items_game
{
get;
set;
}
}
}
要将该字符串转换为有效的JSON,只需要稍微调整一下。
你可以用三个regex替换:
var json = Regex.Replace(
Regex.Replace(
Regex.Replace(
Regex.Replace(data, @"""('r?'n's*'{)", @""":$1"),
@"(})('r?'n's*"")", @"$1,$2"),
@"""('r?'n's*'"")", @""",$1"),
@"""'s+""", @""": """);
data
包含您问题中显示的原始数据。然后我们执行以下转换:
- 我们在行末添加冒号,后面跟着花括号
- 我们在行末添加逗号,后面跟着引号
- 我们在以花括号结束并后跟引号的行后面添加逗号
- 我们在两个引号之间添加一个冒号
如果准JSON与示例中一样规则,并且如果您不介意使用命令行工具将准JSON转换为JSON,则可以轻松使用awk,或者使用sed和any-json之类的组合。下面的代码适用于您的示例(假设quasijson.txt是输入文件):
$ sed -e '/"/s/"/":/2' -e 's/}/},/' quasijson.txt |'
sed -e '1s/^/{/' -e 's/" *$/",/' -e '$s/$/}/' |'
any-json -format=json5
我可以通过在每个"}"后面添加逗号+ Daniel提供的额外Regex代码来解决这个问题。文本文件转换成JSON格式后,没有问题,也可以读取。即使在"}"后面的所有地方都添加了逗号——闭花括号,它仍然有效。
谢谢大家的帮助