Member 13048699 Ответов: 1

Как разобрать массив C в файле .c с помощью скрипта Python?


I have a .c file and it contains several arrays. I need to parse a specific array which has the following name: s_InfoDay day_stat[] = { ... };

My python script has to be able to read this .c file and look for this specific array and perform the process on it. The c array has information in the following format:

s_InfoDay day_stat[] = {
//-------------------------//
//|  Rank        |   Stat   |    Level |       Stance | //
{ 0              , "ALPHA",  "NOTPRESENT", "NOTPRESENT" },
{  NA             , "LAURA",  "UNKNOWN",    "UNKNOWN" },
{  1 | LEAGUE_1   , "MANU" ,   "SECOND",    "ONGOING" },
{  2 | LEAGUE_2   , "MANU" ,   "SECOND",    "ONGOING" },
{  1 | TEAM_3 | (1<<3), "CHELSEA", " FIRST", "WINNERS" },
{  3 |(1<<3) | TEAM_3 , "CHELSEA", " FIRST", "WINNERS" },   
{  0                  , NULL     , NULL    , NULL      }  } ;
The array contains almost 500 lines and it has data in this specific format. I only want to be able to extract the values under the  |   Stat   |    Level | and able to place the in the form of an xml like structure for display purposes.

The xml tags has the following fixed format. I will have a group of 500 of these tags which have the correct values in the stat and level section in the xml tag below:


Что я уже пробовал:

Whenever I parse each line the array, I need to be able to place the string in " " under the Stat in the location of the STAT in the PrimierLeague/Information/STAT and same for the Level in the tag <Description>**Level**</Description>.


Формат xml показан ниже:
<League name="PrimierLeague/Information/**STAT**" TeamType="Team"    visibility="false">
    <Description>**Level**</Description>
    <Target><Property/></Target>
    <Info type="String">EMPTY</Info>
  </League >

Member 13048699

Xml имеет формат follwinf. Я не мог пройти мимо всего этого там, наверху.
<имя-Лига="PrimierLeague/информации/**срочно**" TeamType="команда" видимость="ложно"и GT;
< описание> * * уровень**
< target> & lt; property>
< Info type= "String" & gt;пусто
< / Лига >

CPallini

Альтернативой может быть создание программы на языке Си, производящей вывод XML.

1 Ответов

Рейтинг:
6

Jochen Arndt

Возможная реализация:


  • Объявите и очистите переменную, указывающую, что массив обработан
  • Читать файл строка за строкой:
    with open(path_to_file) as f:
        for line in f:
            process(line)
  • Если массив обрабатывается
  • В противном случае проверьте определение массива и установите индикатор, если он найден

Для создания XML-строк используйте Операции Форматирования Строк[^].


Member 13048699

Я хочу иметь возможность использовать здесь python, а не php. Можете ли вы помочь мне с решением проблемы python? Я был бы вам очень благодарен.

Jochen Arndt

Уупс. Я изменю его. Но должен быть тот же принцип.

Member 13048699

Я не уверен, что вы подразумеваете под этим: объявите и очистите переменную, указывающую на то, что массив обработан. Не могли бы вы привести мне пример? Заранее спасибо.

Member 13048699

Не могли бы вы предоставить мне какой-нибудь макет кода, поскольку я относительно новичок в python. У меня есть опыт работы в основном в C++. Я был бы вам очень благодарен. Мне очень жаль, если я беспокою вас, но я действительно нуждаюсь в помощи.

Member 13048699

@Jochen Arndt в настоящее время я могу распечатать открытый файл в коде python. Не уверен, как реализовать функцию process (). Не могли бы вы мне помочь?

Member 13048699

@Jochen Arndt кое-что я получил за это время.

процесс def (линия):
if line. startswith(' s_InfoDay day_stat[] = {'):
линия печати

с открытым("C:\..\test.c") как f:
для строки в f:
технологическая линия)
Он просто выводит строку s_InfoDay day_stat[] = {. Как выполнить обработку массива. Пожалуйста, посоветуйте мне что-нибудь.

Jochen Arndt

Просто подумайте, как вы сделали бы это в C/C++ (непроверенный):

isProcessing = ложь
с открытым("C:\..\test.c") как f:
 для строки в f:
  если isProcessing:
   isProcessing = процесс (строка)
  elif line. startswith(' s_InfoDay day_stat[] = {'):
   isProcessing = истина

Функция process() теперь должна возвращать False при обнаружении последней строки и True в противном случае:

процесс def (линия):
 предметы = линия.сплит(',')
 stat = items[1]. strip()
 уровень = предметы[2]. полоса()
 если stat = = " NULL":
  возвращать false
 # Создать XML здесь
 вернуть true

Member 13048699

Я не понимаю, почему это должно быть в заявлении elif.
elif line. startswith(' s_InfoDay day_stat[] = {'):
isProcessing = истина

Jochen Arndt

Когда вы уже обрабатываете строку массива, вы обрабатываете ее.
Если нет (else), проверьте, находится ли начало массива.

Это всего лишь пример. Вы можете сделать это и без функции.

Member 13048699

Я только что опубликовал свое решение ниже. Это, кажется, не работает. Не могли бы вы пожалуйста помочь?