Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从txt文件中找到特定的json元素数据列表?_C#_Json - Fatal编程技术网

C# 如何从txt文件中找到特定的json元素数据列表?

C# 如何从txt文件中找到特定的json元素数据列表?,c#,json,C#,Json,我有一个文本文件,其中包含近百万条json格式的记录。像 [{"ev":"AM","sym":"TMHC","v":1000,"av":74917,"op":18.92,"vw":19.1305,"o":19.13,"c":19.15,"h":19.15,"l":19.13,"a":19.143,"z":90,"n":1,"s":1549380300000,"e":1549380360000},{"ev":"AM","sym":"AAPL","v":7103,"av":184266,"op":3

我有一个文本文件,其中包含近百万条json格式的记录。像

[{"ev":"AM","sym":"TMHC","v":1000,"av":74917,"op":18.92,"vw":19.1305,"o":19.13,"c":19.15,"h":19.15,"l":19.13,"a":19.143,"z":90,"n":1,"s":1549380300000,"e":1549380360000},{"ev":"AM","sym":"AAPL","v":7103,"av":184266,"op":35.27,"vw":35.3148,"o":35.3264,"c":35.34,"h":35.34,"l":35.3258,"a":35.3345,"z":710,"n":1,"s":1549380300000,"e":1549380360000}]
[{"ev":"AM","sym":"VB","v":213,"av":98285,"op":149.75,"vw":150.0575,"o":150.2104,"c":150.2104,"h":150.2104,"l":150.2104,"a":150.1944,"z":35,"n":1,"s":1549380300000,"e":1549380360000}]
所以我需要从包含AAPL的文件中找到json元素列表。就像我要传递AAPL一样,它必须给出整个文件中AAPL的json元素列表

{"ev":"AM","sym":"AAPL","v":7103,"av":184266,"op":35.27,"vw":35.3148,"o":35.3264,"c":35.34,"h":35.34,"l":35.3258,"a":35.3345,"z":710,"n":1,"s":1549380300000,"e":1549380360000}
那我怎么才能找到它呢?我试图使用JSONPATH来实现这一点,但在JObject转换时,它给出了如下错误

从JsonReader读取作业对象时出错

我已申请以下代码:

const string filePath = @"D:\Aggregate_Minute_AAPL.json";
string text = System.IO.File.ReadAllText(filePath);
Newtonsoft.Json.Linq.JArray jsonArray = Newtonsoft.Json.Linq.JArray.Parse(text);
var json = Newtonsoft.Json.Linq.JObject.Parse(jsonArray.ToString());
var title = json.SelectToken("$.ev.sym[*]");
Console.WriteLine(title.First());

因为文件很大,所以最好逐行读取,而不是一次全部读取

理解您的结构:每一行都是一个JSON数组,该数组有一个JSON对象

// reading lines in loop
foreach (var line in System.IO.File.ReadLines(filePath))
{
    // Parse the line into the array
    JArray jsonArray = Newtonsoft.Json.Linq.JArray.Parse(line);
    //parse the array into object, 
    //since each line has one object I have hardcoded the index to 0
    //if there can be more objects in one array then will need to iterate
    var json = JObject.Parse(jsonArray[0].ToString());
    // access the token
    var title = json["sym"]; // or json.SelectToken("sym");
    Console.WriteLine(title.First());
}

您需要获取所有数组,无论它们是全部数组还是一行数组,或者每个数组都在新行上,然后将每个数组解析为
JArray
,然后找到具有所需键的属性并获取该键的相应对象

public static List<JObject> GetObjectByValue(string filePath, string matchValue)
{
    var text = File.ReadAllText(filePath);

    var pattern = @"\[(.*?)\]";

    var matches = Regex.Matches(text, pattern);

    var result = matches.Cast<Match>()
            .Select(a => JArray.Parse(a.Value))
            .Select(b => b.ToObject<JObject[]>())
            .Where(x => x.Properties()
                         .Any(y => y.Name == "sym" && y.Value.ToString() == matchValue))
                         .FirstOrDefault()
            .ToList();

    return result;
}
编辑1:

var list_obj = GetObjectByValue(@"Path to your text file", "VB");
如果您想通过使用
Parallel.For
获得匹配对象,则可以使用以下函数

public static List<JObject> GetObjectByValue(string filePath, string matchValue)
{
    var text = File.ReadAllText(filePath);

    var pattern = @"\[(.*?)\]";

    var matches = Regex.Matches(text, pattern);

    List<JObject> jObjects = new List<JObject>();

    Parallel.For(0, matches.Count, i =>
    {
        JArray jArray = JArray.Parse(matches[i].Value);
        var res = jArray.ToObject<JObject[]>().Where(x => x.Properties().Any(y => y.Name == "sym" && y.Value.ToString() == matchValue)).ToList();
        jObjects.AddRange(res);
    });

    return jObjects;
}
公共静态列表GetObjectByValue(字符串文件路径,字符串匹配值)
{
var text=File.ReadAllText(文件路径);
变量模式=@“\[(.*?\]”;
var matches=Regex.matches(文本、模式);
List jObjects=新列表();
Parallel.For(0,matches.Count,i=>
{
JArray JArray=JArray.Parse(匹配[i].Value);
var res=jArray.ToObject()。其中(x=>x.Properties().Any(y=>y.Name==“sym”&&y.Value.ToString()==matchValue)).ToList();
jObjects.AddRange(res);
});
返回作业对象;
}

我认为第一个问题是,您已经向我们展示了文件的每一行都是唯一的JSON记录,但您试图将文件内容解析为单个JSON记录。您的文件包含直接以对象数组开头的JSON数据,对吗?或者它可以放在像
{…}
不,每个记录都以
[{…}]
开头的花括号中。在搜索这个错误的过程中,它向我展示了从记录中删除方括号的方法。但文件中有非常大的记录,所以对于make-loop-for-remove,它也需要时间。@呃,JSON格式有什么问题吗?文件的每一行都有一个JSON数组。OP需要单独读取和解析每一行。json值必须有键,并且在json中没有为每个数组定义键。在这里复制并使用json进行验证,感谢您的宝贵帮助。很好用。我们可以将AsParallel用作文件的PLINQ in,也可以为此制作多个线程吗?所以我们可以非常快速地执行它。此外,我们还需要从文件中获取所有AAPL符号,因此这将花费大量时间。是的,您可以并行执行它以加快速度,并使用
.ToList()
而不是第二个
FirstOrDefault()
应答更新视图在应答中编辑1部分,并让我知道:)编辑1工作正常。只是我需要改善它的时间延迟。由于文本文件中的记录非常大。档案中有近8条lacs记录。非常感谢您提供的最佳帮助。在您改善时间延迟后,请告诉我您是如何做到这一点的。