[C++] Masowa modyfikacja plików tekstowych 3711 3

O temacie

Autor Bogdan Zwei

Zaczęty 27.02.2019 roku

Wyświetleń 3711

Odpowiedzi 3

Bogdan Zwei

Bogdan Zwei

Użytkownicy
Wulgarny skurwiel pierdolony.
posty1864
Propsy541
Profesjabrak
  • Użytkownicy
  • Wulgarny skurwiel pierdolony.
Chcę zmodyfikować około 6000 plików na raz, które są też zaszyfrowane odpowiednio, żeby nikt nie miał do nich wglądu. Poszperałem trochę w internecie, tutaj tutorial, który nasunął mnie na odpowiednią bibliotekę
https://www.youtube.com/watch?v=h2Taf16gQDI
, a tu cała biblioteka do wglądu http://www.cplusplus.com/reference/fstream/fstream/. Mój problem polega na tym, że każdy plik ma jakąś linijkę, która się powtarza, a potrzebuje zmiany, lecz nie wiem jak wyszukać odpowiednie słowo i właśnie o to chciałem zapytać.
Nie mogę zdradzić, co pliki zawierają (nie ja sobie to ubzdurałem :P), więc załóżmy, że każdy plik ma linijkę z tekstem "królik", a odpowiedni program szyfruje go i teraz mamy napis "ąiwg24ć" i tylko program wie, co on oznacza, a chcę zmienić ten napis ("królik") na "drzewo", w każdym pliku, więc potrzebuję jakieś funkcji, która sama wyszuka dane słowo/słowa (w jednym pliku może się powtórzyć to samo słowo) i go zamieni.


Dodatkowo, jeśli jest to możliwe i w miarę nie skomplikowane, potrzebowałbym funkcję, która by przeskakiwała do następnego pliku (i jeśli to konieczne, otwierała kolejny folder) po edycji. Czyli, plik 1 jest edytowany, wskakuje do pliku 2 w tym samym folderze, po czym folder jest pusty, ale jest kolejny folder, który znowu ma 4 pliki i jeden folder, więc otwiera ten kolejny folder, po czym edytuje tam wszystko, otwiera podfoldery i je edytuje, przeskakuje do następnego folderu.
Wizualizacja:

Spoiler
folder
  • plik
  • plik
folder
  • plik
  • plik
  • plik
  • plik
  • folder
    • plik
Nie jest to jednak aż tak potrzebne, bo pliki znajdują się w 14 folderach (w przyszłości na pewno dojdzie więcej), więc mogę to dopisać ręcznie i edytować szybciej, jednak nie liczy się czas, tylko efektywność. Jeśli przeniosę program na inny komputer, będzie łatwiej.
 
:ok: zachęca do dalszej pomocy. Nie zapominaj o tym!

Prywatne wiadomości typu "Ej, pomocy" kasuję od razu. Od tego jest forum, a nie PW.

To me, defeat in anything is merely temporary, and its punishment is but an urge for me to greater effort to achieve my goal. Defeat simply tells me that something is wrong in my doing; it is a path leading to success and truth.

In order to realize our true self we must be willing to live without being dependent upon the opinion of others.

Wonski

Wonski

Gry (themodders@telegram)
radio engineer
posty256
Propsy91
ProfesjaProgramista
  • Gry (themodders@telegram)
  • radio engineer
Czy zadanie to musi być wykonane przy użyciu C++?
Moim zdaniem python nadaje się do takich zadań doskonale. Używanie c++ do tego typu zadań to moim zdaniem przerost formy nad treścią.

Tak więc jeśli c++ nie jest konieczny to sugerowałbym zapoznać się z modułem pythonowym:
os.pathJeśli idzie o wyszukiwanie konkretnych słów w pliku to tu już (jeżeli chcemy to zrobić oczywiście "jak człowiek") użyć wyrażeń regularnych, lepiej znanych jako regexy.

Jeżeli będziesz miał jakieś kłopoty z skonstruowaniem programu w pythonie to daj znać. Jeśli jednak zdecydujesz się na rozwiązanie c++ to również coś wykombinujemy.

BTW. C++17 dostarcza nam nowy moduł zarządzania plikami:
https://en.cppreference.com/w/cpp/filesystem
Co prawda nie korzystałem z tego, ale standardowe rzeczy z reguł są fajne i intuicyjne.
Jeśli dobrze pamiętam to c++ nie dostarcza funkcji odpowiedzialnych za regexy. Tak więc pozostaje rozwiązanie z bibliotek boosta (boost regex) albo ręczna manipulacja stringami.

Myślę nawet, że dałoby radę obskoczyć to zadanie bez użycia jakiegokolwiek języka programowania. Wiele IDE ma opcję "find all"/"replace all" danej frazy w całym drzewie katalogu roboczego. Czy jest to szybkie? Nigdy nie robiłem tego na takiej ilości plików, ale z pewnością jest to efektywne rozwiązanie.
 

Bogdan Zwei

Bogdan Zwei

Użytkownicy
Wulgarny skurwiel pierdolony.
posty1864
Propsy541
Profesjabrak
  • Użytkownicy
  • Wulgarny skurwiel pierdolony.
Jako tako jedynie gdzie programowałem to C++, więc dlatego napisałem o tym. Zapoznam się a Pythonem, jak znajdę czas i w razie pytań/problemów napiszę tutaj.

Dzięki!
 
:ok: zachęca do dalszej pomocy. Nie zapominaj o tym!

Prywatne wiadomości typu "Ej, pomocy" kasuję od razu. Od tego jest forum, a nie PW.

To me, defeat in anything is merely temporary, and its punishment is but an urge for me to greater effort to achieve my goal. Defeat simply tells me that something is wrong in my doing; it is a path leading to success and truth.

In order to realize our true self we must be willing to live without being dependent upon the opinion of others.

Wonski

Wonski

Gry (themodders@telegram)
radio engineer
posty256
Propsy91
ProfesjaProgramista
  • Gry (themodders@telegram)
  • radio engineer

Wonski
Gry (themodders@telegram)

[C++] Masowa modyfikacja plików tekstowych
#3 2019-03-05, 20:09(Ostatnia zmiana: 2019-03-05, 20:42)
Jeszcze co do rozwiązania nieprogramistycznego to przyjemnie idzie załatwić to jednym poleceniem z konsoli:
grep -rnwl . -e "coSzukam" | xargs sed -i 's|coSzukam|naCoZamieniam|g'
"Kropka" po -rnwl powoduje, że komenda jest wykonywana rekursywnie w wszystkich podkatalogach.
Polecenie to wyszukuje frazy "coSzukam" i zamienia ją na "naCoZamieniam".
Składnia regex, więc możesz to dowolnie modyfikować by wyszukiwało inne wzorce.

Komendę tą można również bez problemu odpalić pod windowsem, jeśli masz zainstalowany jakiś terminal typu git bash (instalowany defaultowo wraz z samym gitem).

Moim zdaniem jest to zdecydowanie najszybsze, najbardziej optymalne a przy tym najprostsze możliwe rozwiązanie tego problemu.

edit
Jeżeli zmianom mają podlegać tylko pliki o określonych rozszerzeniach, bądź ich nazwy mają spełniać określone kryteria (napisane przy użyciu regexów) to możesz jeszcze bardziej przyspieszyć wykonanie tego polecenie poprzez dodanie po prostu:
--include="jakas_nazwa"\*.{cpp,hpp,albo_dowolne_inne_rozszerzenie}
Więc wynikowe polecenie będzie wyglądać następująco:
grep -rnwl --include="jakas_nazwa"\*.{cpp,hpp,albo_dowolne_inne_rozszerzenie} . -e "coSzukam" | xargs sed -i 's|coSzukam|naCoZamieniam|g'
Case sensitive w grepie wyłącza się przy pomocy flag:
-i, -y, --ignore-case
Resztę już sam powinieneś ogarnąć a jeśli nie to daj znać.
 


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry