Dodawanie tagów do identycznych lini tekstu


(system) #1

Witam

Próbowałem na własną rękę stworzyć program, który automatycznie dodawałby tagi do odpowiednich linii textu.

Wszystko miało się opierać na tym, że w jednym pliku tekstowym było by coś takiego

Byłby to sam "czysty" tekst z numerkami w tagach na początku lini. Natomiast drugi, o takiej samej nazwie, tyle, że w innym katalogu zawierałby wiki kod z wyłącznie "czystym" tekstem, czyli

Teraz chciałbym, aby cały ten tag z pierwszego pliku

został dodany do tego drugiego bez naruszania zawartości (wikikodu), tak, żeby można to było potem zaimportować do wikii i poprawnie się wyświetlało.

Zależy mi na tym, żeby wystarczyło wprowadzić do programu, samą ścieżkę do katalogu z plikami, a nie pojedyncze pliki z osobna, bo program będzie używany, do przetwarzania dużych ilości plików.

Myślałem, o tym, żeby wykonać to, przez cmd, na zasadzie porównywania dwóch takich samych ciągów znaków i późniejszym dodawaniu tagu, niestety pomysł nie wypalił.

Jeśli ktoś wiedziałby jak wykonać prosto taki, programik, do automatycznego (użytkownik podawałby tylko ścieżkę do katalogu z plikami) przetwarzania w taki sposób plików tekstowych to byłbym bardzo wdzięczny :slight_smile:


(Sawyer47) #2

Raczej nie znajdziesz programu o tak specyficznej funkcjonalności, ale nie ma problemów aby napisać skrypt samemu albo zlecić to komuś. Wnioskując z opisu to można to prosto zrobić w Perlu, Pythonie, Ruby czy nawet bashu. Pytanie czy znasz jakieś narzędzie/język skryptowy którym potrafiłbyś zrealizować to? Jeśli sam nie potrafisz tego zrobić i liczysz na to, że ktoś z forum napisz dla Ciebie ten skrypt to daj więcej szczegółów i przykładowe dane (przed przetworzeniem oraz jak to ma wyglądać po przetworzeniu).


(system) #3
[[Kategoria]]

== Dialogi ==

=== I ===

*A: Jutro jadę nad rzekę.

To jest fragment wikiikodu. Ten wikikod miałby nazwę 1.txt i byłby w katalogu wikii. Równolegle do katalogu wikii, byłby katalog zrodlo z plikiem txt o takiej samej nazwie jak ten z wikiikodem. Różnica była by taka, że ten drugi plik, miałby taką zawartość:

[6582]Jutro jadę nad rzekę.

I teraz chciałbym, żeby program utworzył nowy (trzeci) plik o takiej samej nazwie, lub zmodyfikował jeden z istniejacych tak, aby efekt finalny był taki:

[[Kategoria]]

== Dialogi ==

=== I ===

*A: [6582] Jutro jadę nad rzekę.

Przed samą kwestia został dodany numer w tagach.


(Sawyer47) #4

Mógłbym to zrobić w Perlu lub Pythonie, ale nie na dziś i nie na jutro (nie mam zbyt czasu). Czy pasuje Ci jeden z tych języków programowania? Jeśli chciałbyś uruchomić taki skrypt musiałbyś mieć interpreter Perla lub Pythona - więc dochodzi potrzeba jego instalacji. Jeśli pasuje Ci to, to napisz na PW. Jednak tak jak piszę, mógłbym się za to zabrać pojutrze. Być może do tego czasu pomoże Ci ktoś inny? Tak więc, jeśli nadal potrzebowałbyś takiego skryptu napisz na PW jutro wieczorem.


(Fiołek) #5

Mam dobry dzień, zrobiłem to dla Ciebie w PowerShellu(w ramach treningu). Może nie jest to idealne, ale to jeden z pierwszych moich skryptów w nim.

param([string]$wikiFile = "", [string]$sourceFile= "");

if($wikiFile -eq "" -or $sourceFile -eq "")

{

    Write-Host "Podaj parametry"

    return;

}

$sourceLines = [System.IO.File]::ReadAllLines($sourceFile);

$wikiText = [System.IO.File]::ReadAllText($wikiFile);


Foreach($line in $sourceLines)

{

    $txt = [regex]::Matches($line, "\[[0-9]+\]\s*(.+)")[0].Groups[1].Value;

    $wikiText = $wikiText.Replace($txt, $line);

}


[System.IO.File]::WriteAllText($wikiFile, $wikiText);

(system) #6

W pierwszej lini rozumiem, że treba podać ściezki do katalogów z plikami. Ja podałęm odpowiednio *G:\wikii* i *G:\zrodlo*

natomiast w drugiej lini nie wiedziałęm co wpisać i zostawięłm tak jak było. W 4 lini też zostawiłęm wszystko po staremu, bo nie wiedziałęm o jakie parametry chodzi. Jak nie trudno się domysleć, po wciśnięciu przycisku Run w PowerShellu na dolnej belce pojawił się komunikat, że skrypt nie może zostać uruchomiony, ponieważ jest niestabilny, czy coś w ten deseń...

Fiołek , jeśli można by prosić jakieś wytłumaczenie co do tego kodu :slight_smile:


(Fiołek) #7

Pierwsza linijka to parametry podawane do skryptu(z linii poleceń) - pierwszy to _plik_ z wikikodem, drugi to plik z liniami "[tag]tekst". Następnie sprawdzamy czy podano parametry.

Dalej: wczytujemy _linie_ z pliku podanego jako drugi parametr potem wczytujemy tekst z pliku z pierwszego parametru. W pętli foreach wyciągamy tekst z linii "[tag]tekst" wyrażeniem regularnym(można prościej: tekst jest za pierwszym "]") i zmieniamy w tekście z wikikodem wyciągnięty tekst na [tag]+tekst. Na końcu zapisujemy do pliku zmieniony wikikod.

Użycie:

skrypt.ps1 G:\wiki\1.txt G:\zrodlo\1.txt

(system) #8

Czyli bezpośredniu nic nie zmieniac w kodzie? Tylko w poleceniu podać ścieżki do plików?

Wpisałęm to polecenie do cmd, to otworzyło mi w notatniku ten skrypt. Natomiast jak wpisuję to do PowerShelll, to wyskakuje jakiś bład.


(Fiołek) #9

W PS to będzie tak: "./skrypt.ps1 G:\wiki\1.txt G:\zrodlo\1.txt" zakładając, że skrypt jest w aktualnym katalogu :wink:


(system) #10
PS C:\Users\Piotrek> cd

PS C:\Users\Piotrek> G:

PS G:\> ./skrypt.ps1 G:\wiki\1.txt G:\zrodlo\1.txt

The term './skrypt.ps1' is not recognized as a cmdlet, function, operable program, or script file. Verify the term and

try again.

At line:1 char:13

+ ./skrypt.ps1 <<<< G:\wiki\1.txt G:\zrodlo\1.txt

PS G:\> "./skrypt.ps1 G:\wiki\1.txt G:\zrodlo\1.txt"

./skrypt.ps1 G:\wiki\1.txt G:\zrodlo\1.txt

PS G:\>

Tak to u mnie wyglada. I nie działa.


(Fiołek) #11

A zapisałeś na dysku G mój skrypt pod nazwą "skrypt.ps1"? :wink:


(system) #12

Oczywiście :slight_smile:


(Fiołek) #13

Ja taki pewien bym nie był :wink: Komunikat błędu wyraźnie mówi, że taki plik nie istnieje. Prawdopodobnie masz to zapisane pod "skrypt.ps1.txt"(ukrywanie rozszerzeń), a nie tak jak być powinno.