NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
Lukáš D.
Člen
Avatar
Lukáš D.:8.4.2015 11:42

Jakou metodou upravit string, ve kterém mám postupně názvy souborů, např. "soubor_conflict-20150402-122951.txt", aby mi vracel "soubor.txt". Ty čísla (časové razítka) jsou u každého jiná.

Když bych se pokusil nastínit myšlenku, tak nějak takto:
nazev.Replace("_con­flict-********-******", "") ,kdy * reprezentuje jakékoliv číslo.

Poradí někdo jak to udělat?

 
Odpovědět
8.4.2015 11:42
Avatar
Odpovídá na Lukáš D.
Michal Štěpánek:8.4.2015 13:16

Kolik těch souborů je? To číslo má vždycky stejný počet číslic? Když by se všechno potom jmenovalo "soubor.txt", jak je odlišíš?

Nahoru Odpovědět
8.4.2015 13:16
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Lukáš D.
Člen
Avatar
Odpovídá na Michal Štěpánek
Lukáš D.:8.4.2015 13:18

Souborů jsou stovky, ano má to vždy stejný počet pozic.

 
Nahoru Odpovědět
8.4.2015 13:18
Avatar
Lukáš D.
Člen
Avatar
Odpovídá na Michal Štěpánek
Lukáš D.:8.4.2015 13:27

Soubory se jmenují různě a obsahují všemožné znaky. Pouze to "_conflict-20150402-122951" má vždy stejný počet znaků.

 
Nahoru Odpovědět
8.4.2015 13:27
Avatar
Odpovídá na Lukáš D.
Michal Štěpánek:8.4.2015 13:29

V tom případě by se to dalo spočítat, od kterého znaku se má udělat replace. Zjistíš si celkový počet znaků od toho odečteš "ten" počet znaků a uděláš replace.

Nahoru Odpovědět
8.4.2015 13:29
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Lukáš D.
Člen
Avatar
Odpovídá na Michal Štěpánek
Lukáš D.:8.4.2015 13:32

Taky mě to napadlo, ale nevím jak přesně na to, poradíš jak to přesně spočítat a jak to potom odečíst a zobrazit?

 
Nahoru Odpovědět
8.4.2015 13:32
Avatar
Lukáš D.
Člen
Avatar
Odpovídá na Lukáš D.
Lukáš D.:8.4.2015 13:59

Mohl by si udělat příklad na tomto stringu "ukol45_v3_conflict-20150402-122951.txt"?

 
Nahoru Odpovědět
8.4.2015 13:59
Avatar
rawen
Člen
Avatar
Odpovídá na Lukáš D.
rawen:8.4.2015 14:00

ty chceš přejmenovat jen část názvu souboru?

Nahoru Odpovědět
8.4.2015 14:00
Co můžeš naprogramovat dnes, neodkládej na zítřek.
Avatar
Lukáš D.
Člen
Avatar
Odpovídá na rawen
Lukáš D.:8.4.2015 14:02

Ano, přejmenovat část názvu, který jsem si převedl do stringu. Stačí mi jen rada jak pracovat se stringem.

 
Nahoru Odpovědět
8.4.2015 14:02
Avatar
Odpovídá na Lukáš D.
Michal Štěpánek:8.4.2015 14:25
string nazev = "ukol45_v3_conflict-20150402-122951.txt";
int pocetznaku = nazev.Length; //celkový počet znaků
int odebrat = 29; //počet znaků, které chci odebrat
int pocatek = nazev.Length - 29; //zjistit, odkud začnu odebírat
string novynazev = nazev.Remove(pocatek, 29) + ".txt";

v programu bych to samozřejmě zkrátil, tady je to "polopaticky"...

výsledek: ukol45_v3.txt

Editováno 8.4.2015 14:27
Nahoru Odpovědět
8.4.2015 14:25
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
rawen
Člen
Avatar
Odpovídá na Lukáš D.
rawen:8.4.2015 14:26

Tak ono obecně jde se stringem dělat cokoliv. Tobě by se mohly hodit metody .Insert(), která na zvolenou pozici vloží string a .Remove(), která od zvolené pozice umaže zvolenou část stringu..

string staryNazev = @"C:\..\_conflict-20150402-122951.txt"; // prostě nějaká url na soubor
string novyNazev = String.Empty;

int pozice = staryNazev.LastIndexOf("_conflict-");

novyNazev = staryNazev.Remove(pozice + 10, 15);
novyNazev = novyNazev.Insert(pozice + 10, "novaCisla");

File.Move(staryNazev, novyNazev);

Přes LastIndexOf() si zjistím index ve stringu, kde se vyskytuje string "_conflict-", pak na zvolené pozici, kde se zvolený string nacházel přičtu jeho délku (10), abych umazával až za názvem "_conflict-" a smažu 15 znaků, což jsou jen ta tvoje čísla.. pak už jen stačí na onu pozici přes insert vložit co chci a přes File.Move provést přejmenování souboru..

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
8.4.2015 14:26
Co můžeš naprogramovat dnes, neodkládej na zítřek.
Avatar
Tayson
Člen
Avatar
Odpovídá na Lukáš D.
Tayson:8.4.2015 15:39

Skus toto:

string nejakaPremenna = nazev.Split('_')[­0].Split('.')[1];

 
Nahoru Odpovědět
8.4.2015 15:39
Avatar
Tayson
Člen
Avatar
Odpovídá na Tayson
Tayson:8.4.2015 15:40

Este tam samozrejme pridaj uprostred tu bodku :)

 
Nahoru Odpovědět
8.4.2015 15:40
Avatar
Lukáš D.
Člen
Avatar
Odpovídá na rawen
Lukáš D.:9.4.2015 6:35

Všem díky za pomoc.
To nejlepší řešení je od rwn, pomohlo mi pochopení funkce LastIndexOf, to bylo to hlavní pro zdárné řešení.

výsledek vypadá takto:

string novyNazev = String.Empty;
if (file.Name.Contains("_conflict") == true)
{
        int pozice = file.Name.LastIndexOf("_conflict");
        novyNazev = file.Name.Remove(pozice, 25);
        Console.WriteLine(novyNazev);
}
else
Console.WriteLine(file.Name);
Editováno 9.4.2015 6:38
 
Nahoru Odpovědět
9.4.2015 6:35
Avatar
Lukáš D.
Člen
Avatar
Lukáš D.:9.4.2015 6:51

Kdyby náhodou někoho zajímal celý program, tak zde ho přikládám:

static void Main(string[] args)
{
string cesta = @"c:\_DATA";
ListFiles(cesta);
Console.ReadLine();
}
static void ListFiles(string path)
{
 DirectoryInfo directoryInfo= new DirectoryInfo(path);

 if(directoryInfo.Exists)
        {
        FileInfo[] fileInfo= directoryInfo.GetFiles();
        DirectoryInfo[] subdirectoryInfo = directoryInfo.GetDirectories();

        foreach (DirectoryInfo subDirectory in subdirectoryInfo)
        {
                ListFiles(subDirectory.FullName);
        }
        foreach(FileInfo file in fileInfo)
        {
                if (file.Length == 0)
                {
                        bool exists = Directory.Exists(file.DirectoryName.Replace(@"c:\", @"c:\cisteni\"));
                        if (!exists)
                                Directory.CreateDirectory(file.DirectoryName.Replace(@"c:\", @"c:\cisteni\"));
                        File.Move(file.FullName, Path.Combine(file.DirectoryName.Replace(@"c:\", @"c:\cisteni\"), file.Name));
                        Console.WriteLine(file.FullName);
                }
                else
                {
                        string novyNazev = String.Empty;
                        if (file.Name.Contains("_conflict") == true)
                        {
                                int pozice = file.Name.LastIndexOf("_conflict");
                                novyNazev = file.Name.Remove(pozice, 25);
                                Console.WriteLine(novyNazev);
                                File.Move(file.FullName, Path.Combine(file.DirectoryName, novyNazev));
                        }
                        else
                        Console.WriteLine(file.Name);
                }
        }
        }
}
 
Nahoru Odpovědět
9.4.2015 6:51
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 15 zpráv z 15.