Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.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# 自定义行分隔符和json上的U-SQL自定义提取器_C#_Azure Data Lake_U Sql - Fatal编程技术网

C# 自定义行分隔符和json上的U-SQL自定义提取器

C# 自定义行分隔符和json上的U-SQL自定义提取器,c#,azure-data-lake,u-sql,C#,Azure Data Lake,U Sql,我有几个数据结构如下的文本文件: { huge json block that spans across multiple lines } --#newjson#-- { huge json block that spans across multiple lines } --#newjson#-- { huge json block that spans across multiple lines } etc.... 因此,实际上是json块由“--#####--”字符串行分隔。

我有几个数据结构如下的文本文件:

{
huge 
json 
block that spans across multiple lines
}
--#newjson#--
{
huge 
json 
block that spans across multiple lines
}
--#newjson#--
{
huge 
json 
block that spans across multiple lines
} etc....
因此,实际上是json块由
“--#####--”
字符串行分隔。 我正试图编写一个客户提取器来解析这个。问题是,我不能使用
string
数据类型为json反序列化器提供数据,因为它的最大大小为128 KB,并且json块不适合此类型。使用自定义提取器解析此文件的最佳方法是什么

我尝试过使用下面的代码,但不起作用。即使是行分隔符--#newjson--“似乎也无法正常工作

public SampleExtractor(Encoding encoding, string row_delim = "--#newjson#--", char col_delim = ';')
{
    this._encoding = ((encoding == null) ? Encoding.UTF8 : encoding);
    this._row_delim = this._encoding.GetBytes(row_delim);
    this._col_delim = col_delim;
}

public override IEnumerable<IRow> Extract(IUnstructuredReader input, IUpdatableRow output)
{ 
    //Read the input  by json
    foreach (Stream current in input.Split(_encoding.GetBytes("--#newjson#--")))
    {
        var serializer = new JsonSerializer();

        using (var sr = new StreamReader(current))
        using (var jsonTextReader = new JsonTextReader(sr))
        {
            var jsonrow = serializer.Deserialize<JsonRow>(jsonTextReader); 
            output.Set(0, jsonrow.status.timestamp);
        }
        yield return output.AsReadOnly();
    }
} 
public SampleExtractor(编码编码,字符串行_delim=“-->newjson#--”,字符列_delim=”;)
{
这是._encoding=((encoding==null)?encoding.UTF8:encoding);
this.\u row\u delim=this.\u encoding.GetBytes(row\u delim);
这个;
}
公共重写IEnumerable Extract(IUnsttructureDrader输入,IUpdatableRow输出)
{ 
//通过json读取输入
foreach(input.Split(_encoding.GetBytes(-->newjson-->))中的当前流)
{
var serializer=new JsonSerializer();
使用(var sr=新的StreamReader(当前))
使用(var jsonTextReader=new jsonTextReader(sr))
{
var jsonrow=serializer.Deserialize(jsonTextReader);
Set(0,jsonrow.status.timestamp);
}
产生返回输出。AsReadOnly();
}
} 

以下是实现解决方案的方法:

1) 创建JSON对象的c#等价物 注意:-假设文本文件中的所有json对象都相同。 例如:

Json代码
{
“id”:1,
“值”:“你好”,
“另一个价值观”:“世界”,
“价值目标”:{
“名称”:“obj1”
},
“价值清单”:[
1.
2.
3.
]

}
这样做不需要自定义提取器

最好的解决方案是逐行添加一个json。然后可以使用文本提取器逐行提取。您还可以选择自己的分隔符

REFERENCE ASSEMBLY [Newtonsoft.Json];
REFERENCE ASSEMBLY [Microsoft.Analytics.Samples.Formats];

    @JsonLines= 
        EXTRACT 
            [JsonLine] string
        FROM
            @Full_Path
        USING 
            Extractors.Text(delimiter:'\b', quoting : false);


@ParsedJSONLines = 
    SELECT 
        Microsoft.Analytics.Samples.Formats.Json.JsonFunctions.JsonTuple([JsonLine]) AS JSONLine
    FROM 
        @JsonLines

@AccessToProperties=
    SELECT 
        JSONLine["Property"] AS Property
    FROM 
        @ParsedJSONLines;