BG Development


Страници: (2) [1] 2   ( Първото ново мнение ) Reply to this topicStart new topicStart Poll

> Отделяне на данни от текстови файл, Възможно най-компактен C код
avsrm
Публикувано на: 31-05-2022, 18:19
Quote Post



Име: Но
Група: Потребител
Ранг: Новопостъпил

Мнения: 23
Регистриран на: 21.01.08



Здравейте
Имам генериран текстови файл с информация. Това са кодове към машина ... по различно е от G кодовете за CNC-тата. Трябва да добавя възможност да отделя точно определена информация от файла за други цели. Информацията върви на редове, като всеки ред почва с номер на двойката цифри, От 00000 до 99999. Трябва ми отделена само втората колона като масив. buf[.....]=(EE,EE,FE,CD,FE,FE,91,45,9B ...FF,FF);
Индекса на буфера е известен, между първите 5 знака с номера има еднакво на брой паузи %20 , всеки ред завършва с каретка и LF. На ред -данните които ми трябват са възможни само двойки знаци , като са от една до 4 двойки. Ако е възможно на чисто C . Опитах да търся примерно със strstr(); Но резултата никак не ми хареса ...
Не ми е силата тук. Търся някакви насоки или някакъв примерен код за подобни задачи...
Поздрави.
CODE

LKWHJERTLHKEVMLEHJ;JKNSN LG
DTH54634757567567567
THDRJTYIKFTKJFJXFDNXFGJHTJ
FGHFJDTYJTYJKTYJK
00000        EEEE         dgsdg           dfgdg
00002        FE             f              
00003        CD            f              
00004        FEFE         fgdfg            dfgfg675
00006        91            rt                 hhj
00007        45            5678            hjmnjhm
00008        9B            34we            89789
00009        45            54564           87989
00010        a5            254536         8987
00011        45            DFDF            uiyE
00014        aF45B9     RTRT            JOLDF
00015        45            3456            TY65555
00018        225357     7890            FGHFGH
...
00030        FF              2              
00031        FF              2              
00032        FF              2              
00036        EC5EFFFF   ERR             87YYHGGG




--------------------
Знам само малко от Borland Builder C++ 6.
PMEmail Poster
Top
dvader
Публикувано на: 31-05-2022, 19:49
Quote Post


Group Icon
Име:
Група: VIP
Ранг: Почетен член

Мнения: 5002
Регистриран на: 12.07.05



Взимаш първият срещнат текстов редактор и пишеш простичък regexp който трие всичко, освен втората колона.

Още по-прост вариант - махаш всички излишни шпации и табове, че да останат по една между полетата, после зареждаш файла с Excel като CSV файл с разделител шпация и получаваш данните по колони.


--------------------
I find your lack of faith disturbing
PM
Top
Антон Яначков
Публикувано на: 31-05-2022, 20:12
Quote Post



Име: Антон Яначков
Група: Потребител
Ранг: Почетен член

Мнения: 2633
Регистриран на: 27.07.16



Пиша ти решението на Vb6 защото този език харесвам, но идеята лесно можеш да си я преработиш на всякакъв език, използвайки коментарите, които съм сложил:

CODE

Dim output ' декларация на един помощен масив
Dim output2 ' декларация на втори помощен масив

Private Sub Command1_Click() ' Бутон, при натискане на който ще се отдели информацията
output = Split(Text1.Text, Chr(13)) ' Набутваме в масив output по разделител ентер

For j = 0 To UBound(output) ' За всеки елемент, тоест линия от файла правим следното
   For i = 0 To 10
       output(j) = Replace(output(j), "  ", " ") ' Махаме излишните шпации, за да остане само по една
   Next i
   
   output2 = Split(output(j), " ")  ' Сега разделяме стринга от линията по разделител шпация и набутваме в втория масив output2
   
   If Len(output2(0)) = 6 Then ' Проверяваме дали първия елемент е от 6 символа и ако е то взимаме втория елемент output2(1), който ни трябва
       Text2.Text = Text2.Text & output2(1) & " " ' тук създавам един нов стринг само от нужната ни информация, за да се види какво сме получили
   End If                                                                   ' а при теб просто трябва да се вкара в масив
Next

End Sub


А това е картинка на формата и резултата:
user posted image
PMEmail PosterUsers Website
Top
Дон Реба
Публикувано на: 01-06-2022, 07:49
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 9720
Регистриран на: 11.11.06



за съжаление вградените инструменти на С/С++ не са удобни за парсване на текстова информация, най-вече защото 1. не връщат броя обработени символи, а броя обработени аргументи и 2. новия ред е просто "бял" символ. 3 форматиращия стринг на sscanf не бачка по начина който се очаква (аналогично на printf). цин и цоут изобщо не ги дискутирам, те стават само за курсови работи .
в твоя случай , ако често ти се налагат подобнизадачи, най-добре се подготви със някакви помощни инструменти, които да ползваш винаги като опреш до такава ситуация. в конкретния случай , дори само функция която копира стринг до ретърн и връща бройката символи ще свърши чудесна работа. ако имаш такава череш ред, после със sscanf вземаш втория стринг и така до края
CODE

int readln(char *src,char* dst){
...... попълни сам, трябва да копира в dst всичко от src до ретърн , и да върне броя копирани символи вкл и ретърна
}

int Parse(char *text,int *result){
int N=0;
int ptr=0;// маркер до къде сме обработили текста
char line[256],dummy[32],numb[32];
while(L=readln(text+ptr,line)){
  ptr+=L;// придвижваме маркера напред
  if(2!=sscanf(line,"%s %s",dummy,numb))continue;// четем реда, прескачаме ако е празен
  sscanf(numb,"%x",result+N++);
}
return N;


Това мнение е било редактирано от Дон Реба на 01-06-2022, 07:51
PM
Top
thrawn
Публикувано на: 01-06-2022, 08:07
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 3341
Регистриран на: 17.01.17



Не може да няма някакви библиотеки с имплементация на регулярни изрази. Практически това се решава с един регулярен израз, както каза dvader (като в него се залага и контрол за валидност на полетата).
Не може ли да се ползва нещо подобно?

Иначе, най-тъпото което се сещам - прави се парсер на произволен език който да генерира хедър файл с желания масив като константа или направо бинарен файл.
PMEmail Poster
Top
ici
Публикувано на: 01-06-2022, 09:29
Quote Post


Group Icon
Име: Ивайло Илчев
Група: VIP
Ранг: Почетен член

Мнения: 17890
Регистриран на: 06.06.04



QUOTE (thrawn @ 01-06-2022, 09:07)
Не може да няма някакви библиотеки с имплементация на регулярни изрази. ...

На C това се прави с flex. трябва ти *.c, *.l и Makefile

http://web.mit.edu/gnu/doc/html/flex_1.html


--------------------
Ние не сме в една лодка, ние сме в една буря. Лодките са различни.

Следващият път когато се почувстваш ненужен, грозен и недооценен, помни че освен това си и тъп.
PMEmail PosterUsers Website
Top
Bender++
Публикувано на: 01-06-2022, 09:43
Quote Post



Име:
Група: Потребител
Ранг: Редовен член

Мнения: 334
Регистриран на: 18.04.21



това се прави елемнтарно с краен автомат, не трябват никакви реглулярни изрази (въпреки че и те са крайни автомати) и библиотеки

Даже може само да четеш ред по ред и в един цикъл и сплитваш по разделител

Това мнение е било редактирано от Bender++ на 01-06-2022, 09:45


--------------------
Ваксините са лъжа и НЕ работят! Не на ковид фашизма!
Слава на Цар Путин! Долу украинските фашисти!
Слава на героите - Z V
PMEmail Poster
Top
avsrm
Публикувано на: 01-06-2022, 11:45
Quote Post



Име: Но
Група: Потребител
Ранг: Новопостъпил

Мнения: 23
Регистриран на: 21.01.08



QUOTE (Bender @ ++01-06-2022, 09:43)
това се прави елемнтарно с краен автомат, не трябват никакви реглулярни изрази (въпреки че и те са крайни автомати) и библиотеки

Даже може само да четеш ред по ред и в един цикъл и сплитваш по разделител

/краен автомат/ стеит машина ли визираш !!!
Имах правен DataProcessor за пакети с хедър и end с вариеибъл lenght.
Там мисля че прихващах процес и следях пакетите , ще се разровя да погледна как ставаше че съм забравил. Няма да е лесно защото трябва да изключа всички възможности за грешка, че иначе ще има взривове icon_biggrin.gif

ici Поздрави след толкова години.

Това мнение е било редактирано от avsrm на 01-06-2022, 11:52


--------------------
Знам само малко от Borland Builder C++ 6.
PMEmail Poster
Top
ici
Публикувано на: 01-06-2022, 15:21
Quote Post


Group Icon
Име: Ивайло Илчев
Група: VIP
Ранг: Почетен член

Мнения: 17890
Регистриран на: 06.06.04



QUOTE (avsrm @ 01-06-2022, 12:45)
ici Поздрави след толкова години.

Да не сме работили заедно?


--------------------
Ние не сме в една лодка, ние сме в една буря. Лодките са различни.

Следващият път когато се почувстваш ненужен, грозен и недооценен, помни че освен това си и тъп.
PMEmail PosterUsers Website
Top
ici
Публикувано на: 01-06-2022, 15:48
Quote Post


Group Icon
Име: Ивайло Илчев
Група: VIP
Ранг: Почетен член

Мнения: 17890
Регистриран на: 06.06.04



CODE
import re

text = """

LKWHJERTLHKEVMLEHJ;JKNSN LG
DTH54634757567567567
THDRJTYIKFTKJFJXFDNXFGJHTJ
FGHFJDTYJTYJKTYJK
00000        EEEE         dgsdg           dfgdg
00002        FE             f
00003        CD            f
00004        FEFE         fgdfg            dfgfg675
00006        91            rt                 hhj
00007        45            5678            hjmnjhm
00008        9B            34we            89789
00009        45            54564           87989
00010        a5            254536         8987
00011        45            DFDF            uiyE
00014        aF45B9     RTRT            JOLDF
00015        45            3456            TY65555
00018        225357     7890            FGHFGH
00030        FF              2
00031        FF              2
00032        FF              2
00036        EC5EFFFF   ERR             87YYHGGG

"""

x =  map(lambda x: int(x, 16), re.findall(r"^[\d]+\s+([A-Za-z0-9]+)\s.*$", text, flags = re.MULTILINE))
print(",".join(map(hex, x)))


QUOTE
*** Python 3.8.10 (tags/v3.8.10:3d8993a, May  3 2021, 11:48:03) [MSC v.1928 64 bit (AMD64)] on win32. ***
>>>
*** Remote Interpreter Reinitialized ***
0xeeee,0xfe,0xcd,0xfefe,0x91,0x45,0x9b,0x45,0xa5,0x45,0xaf45b9,0x45,0x225357,0xff,0xff,0xff,0xec5effff
>>>


--------------------
Ние не сме в една лодка, ние сме в една буря. Лодките са различни.

Следващият път когато се почувстваш ненужен, грозен и недооценен, помни че освен това си и тъп.
PMEmail PosterUsers Website
Top
1 потребители преглеждат тази тема в момента (1 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Страници: (2) [1] 2  Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2019 | BG Development | All Rights Reserved
RSS 2.0