Diskuze: C#, operace se stringem

C# .NET .NET (C# a Visual Basic) C#, operace se stringem American English version English version

Avatar
Lukáš D.
Člen
Avatar
Lukáš D.:

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:

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.:

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.:

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:

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.:

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.:

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
rwn
Člen
Avatar
Odpovídá na Lukáš D.
rwn:

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 rwn
Lukáš D.:

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:
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
rwn
Člen
Avatar
Odpovídá na Lukáš D.
rwn:

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í
+1 bodů
Ř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:

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:

Este tam samozrejme pridaj uprostred tu bodku :)

 
Nahoru Odpovědět 8.4.2015 15:40
Avatar
Lukáš D.
Člen
Avatar
Odpovídá na rwn
Lukáš D.:

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.:

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.