Распарсить таблицу

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by vasaeps3, 21 Jun 2011.

  1. vasaeps3

    vasaeps3 New Member

    Joined:
    21 Oct 2010
    Messages:
    11
    Likes Received:
    0
    Reputations:
    0
    Вечер добрый!
    Вот такой вопрос у меня встал - мне нужно распарсить таблицу. Кто может поделиться как это будет лучше сделать?
     
  2. inCode

    inCode Member

    Joined:
    20 Jun 2011
    Messages:
    141
    Likes Received:
    22
    Reputations:
    5
    Какой язык, скинул бы пример таблицы?

    .xls, html?

    В ООЯП есть свои классы для работы с xls.
    В html таблице приводишь все в строку, потом используешь методы типа Replace, Split.

    А так с таким вопросом, пальцем в небо...
     
  3. vasaeps3

    vasaeps3 New Member

    Joined:
    21 Oct 2010
    Messages:
    11
    Likes Received:
    0
    Reputations:
    0
    на C#
    страница HTML. Не xml. Просто регулярными выражениями там будет очень тяжело. я пытался Xpatch использовать - но не получается.
     
  4. inCode

    inCode Member

    Joined:
    20 Jun 2011
    Messages:
    141
    Likes Received:
    22
    Reputations:
    5
    HtmlAgilityPack как вариант попробуй, регулярными тоже самое.

    Вот пример под эту страничку: forum.kazahstanki.com/memberlist.php
    Code:
    var html1 = Encoding.Default.GetString(b1);
               string s = Strip(html1); 
               var startIndex = s.IndexOf("Аватар") + "Аватар".Length;
               var endIndex = s.IndexOf("Показано с ", startIndex);
               var res = s.Substring(startIndex, endIndex - startIndex);
              string i1 = res.Replace(" ", string.Empty);
              string i2 = i1.Replace("\t", string.Empty);
               string[] arr = i2.Trim().Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
               for (int i = 0; i < arr.Length - 1; i += 3)
               {
                   string nick = arr[i];
                   string rank = arr[i + 1].Split(' ')[0];
                   userslist.Add(nick);
               }
    
     
  5. vasaeps3

    vasaeps3 New Member

    Joined:
    21 Oct 2010
    Messages:
    11
    Likes Received:
    0
    Reputations:
    0
    спасибо.
    А кто нибудь парсил HTML документы с помощью Xpatch на C# ???
     
  6. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    Xpatch o_O,
    XPath?
     
  7. vasaeps3

    vasaeps3 New Member

    Joined:
    21 Oct 2010
    Messages:
    11
    Likes Received:
    0
    Reputations:
    0
    ага - оно самое. Обшибся с названием
     
  8. bad_boy

    bad_boy Elder - Старейшина

    Joined:
    30 Dec 2004
    Messages:
    187
    Likes Received:
    33
    Reputations:
    3
    kairos-blog.ru/парсим-html-265
     
  9. vasaeps3

    vasaeps3 New Member

    Joined:
    21 Oct 2010
    Messages:
    11
    Likes Received:
    0
    Reputations:
    0
    Да, я читал эту статья и пытался сделать. Для контакта с самого примера все работает. Для этого же сайта не хочет
    Code:
    var doc = VkRequest.Request("http://www.buker.ru/dostaken.php").GetHtmlDocument();
                var postNodes = doc.DocumentNode.SelectNodes("//table[@class='moduletable1']/tbody/tr/td[1]");
                List<string> posts = new List<string>();
                foreach (var item in postNodes)
                {
                    MessageBox.Show(item.OuterHtml);
                }
                
    
    сам запрос составлен правильно. Ошибка возникает в foreach(ругается на postNodes) - Сслылка на объект не указывает на экземпляр объекта.
     
  10. inCode

    inCode Member

    Joined:
    20 Jun 2011
    Messages:
    141
    Likes Received:
    22
    Reputations:
    5
    ты задаешь неправильный критерий выбора нодов, соответственно оно ничего не выбирает и не с чем работать в foreach .

    Да и для той страницы регулярные выражения тебе в помощь.
     
  11. Igorok

    Igorok New Member

    Joined:
    12 Mar 2011
    Messages:
    39
    Likes Received:
    1
    Reputations:
    0
    так почему регулярными? на блоге каироса написано что регулярными выражениями невозможно распарсить всю страницу. Сам когда парсил сложные структуры, регулярками сложно, требовалось выделять более обобщёные участки, а потом уже искать в них. Используй другие альтернативы.
    P.S привет от пиликана!
     
  12. inCode

    inCode Member

    Joined:
    20 Jun 2011
    Messages:
    141
    Likes Received:
    22
    Reputations:
    5
    регулярными сложнее(смотря для кого), но более эффективно.
    Все, что вы там используете в основе лежат регулярные выражения. И сам ваш великий кайрос брал за основу своих классов регулярные выражения.
    На том блоге, вы тупо копируете текст, классы, и не поймете вообще как этот код работает, не говорю уже, об элементарной проверке кода.
     
  13. Igorok

    Igorok New Member

    Joined:
    12 Mar 2011
    Messages:
    39
    Likes Received:
    1
    Reputations:
    0
    почему вы говорите что я тупо копирую код? вы видели мои программы?
     
  14. inCode

    inCode Member

    Joined:
    20 Jun 2011
    Messages:
    141
    Likes Received:
    22
    Reputations:
    5
    ну на C# писать много ума не нужно(наверное у него самое низкий "уровень сложности вхождения"), прочитал книжку по синтаксису и сидишь с инета копируешь готовые примеры с классами(ваш случай). Да весь framework сделали вам в помощь. Пишите, используя уже все готовое и все. А как это внутри работает это уже не важно...
    Или же сравни это же с ASM\C
     
  15. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    Скажу по секрету: много ума вообще не нужно чтобы писать мелкие программки, а вот когда в проекте сотни тысяч строк то еще как нужно хоть на шарпе, хоть на Си. Вообще оснвная сложность в программировании это скорее проектирование и сопутствующие вещи. Набив руку, используя готовые либы и плагины по типу решарпера можно вообще писать по 5к-10к строк в в день. Получается что даже один программист сможет запросто реализовывать по 1 среднему проекту в месяц. Чего как раз таки не получается, ибо лично у меня больше времени не на само кодирование уходит.
    Нужна мне например работа с файлами, простое чтение/запись. Зачем мне вдаваться в детали работы с файлами в винАпи, тем самым отвлекаясь от своей предметной области в такую слишком проблемно-ориентированную (а еще и платформо-зависимую) проблему, тем самым занимаясь не тем что нужно и ковыряясь в устаревшем апи из 80-х?
     
  16. inCode

    inCode Member

    Joined:
    20 Jun 2011
    Messages:
    141
    Likes Received:
    22
    Reputations:
    5
    ну ооп и придумано для облегчения работы в "промышленных" масштабах, но если тип использует классы, которые он не знает и на 10% из чего они состоят, то я думаю написать 10 строчек кода, которые он понимает намного лучше чем 2 в которых он вообще не разбирается.

    А насчет винапи, кстати хороший пример, была недавно проблема, под C# нужно было писать кое-что с использованием WinApi, пришлось делать свои классы, но чтобы их сделать полез изучать все эти особенности. Но смысл в том, что это мои классы и я знаю, что делает каждая строчка кода...
     
  17. Igorok

    Igorok New Member

    Joined:
    12 Mar 2011
    Messages:
    39
    Likes Received:
    1
    Reputations:
    0
    inCode, харэ тут разводить базар, что ты крутой прогер, тут как бы проблема совсем другая была и не нужно тут включать супермена
    GhostOnline, я полностью с ним согласен, нужно не забывать код, который уже написали и лучше написать что-то новое, а не тратиться на то что уже 100500 раз делали.
     
  18. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    [OFFTOPIC]inCode - динозавр, ошибся форумом[/OFFTOPIC]