Как превратить такую ​​строку в сетку данных? (C # .Net) - PullRequest
1 голос
/ 03 мая 2010

Итак, у меня есть такая строка (полученная с php-сервера ... обычный print_r массива)

 Array ( [item_number_in_array] => Array ( [id] => id_value [title] title_value_as_string_vith_spaces [content] => content_value_as_string_vith_spaces ) [item_number_in_array]... )

альтернативный текст http://superior0.narod.ru/string.jpg

Мне нужно, как представить это в виде таблицы в C #

альтернативный текст http://superior0.narod.ru/table.jpg

Как это сделать?

1 Ответ

1 голос
/ 03 мая 2010

Я не очень разбираюсь в php, но я думаю, что вы должны упорядочить данную строку во что-то более похожее на сетку (например, в csv-подобный файл), а затем легко разобрать ее с помощью c #.

Поскольку строка, которую вы даете, в основном php, вы можете проанализировать ее с помощью синтаксического анализатора php (direclty в php или в c #) и, анализируя лексемы, можете построить свою сетку.

Посмотрите здесь некоторые подсказки -> Быстрый анализ PHP в C #

РЕДАКТИРОВАТЬ 1: в любом случае, если структура всегда одна и та же (т. е. Array ([0] => Array («нет массива внутри») [1] => Array («нет массива внутри») ...), вы можете проанализировать его в c # с помощью Regex

РЕДАКТИРОВАТЬ 2: Я имею в виду что-то вроде этого (это очень грубо, но проверено):

Regex arrayRegex = new Regex(@"Array[ \t]*\((.+)\)");
Regex rowRegex = new Regex(@"\[([^\]]+)\] => Array \( ([^)]+)[ \t]*\)");
Regex entryRegex = new Regex(@"\[([^\]]+)\] => ([^\]\[]+)");

var rows = new List<SortedDictionary<string,string>>();
var matches = arrayRegex.Matches(textToParse);
foreach (Match match in matches)
{
    if (match.Groups.Count != 2)
        throw new Exception("Invalid array");
    var rowsMactches = rowRegex.Matches(match.Groups[1].Value);
    foreach (Match rowMatch in rowsMactches)
    {
        var rowDict = new SortedDictionary<string, string>();
        if (rowMatch.Groups.Count != 3)
            throw new Exception("Invalid row");
        var entryMatches = entryRegex.Matches(rowMatch.Groups[2].Value);
        foreach (Match entryMatch in entryMatches)
        {
            if (entryMatch.Groups.Count != 3)
                throw new Exception("Invalid entry");
            string key = entryMatch.Groups[1].Value;
            string val = entryMatch.Groups[2].Value;
            rowDict.Add(key, val);
        }
        rows.Add(rowDict);
    }
}

// use the first row to build the columns (N.B. we suppose all dictionaries have the same keys)
var firstRow = rows.First();
DataTable dt = new DataTable();
foreach (string colName in firstRow.Keys)
{
    dt.Columns.Add(colName);
}
foreach (var row in rows)
{
    dt.Rows.Add(row.Values.Cast<object>().ToArray());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...