Punkte aus Dateinamen entfernen (Zeichenketten)
Schreiben Sie ein Programm oder Skript, das Punkte durch ein Leerzeichen ersetzt, aber nicht den Punkt vor der Datei-Erweiterung. Lesen Sie hierfür die Dateinamen aus einem Ordner aus.
Beispiele:
- Hallo.du.txt > Hallo du.txt
- CMakeLists.txt > CMakeLists.txt
- Test > Test
- Das.ist.ein.Test.txt > Das ist ein Test.txt
Zusatz:
- Das Programm so schreiben, dass es auch auf einzelne Dateien angewendet werden kann.
- Das Programm so schreiben, dass man die durch das Leerzeichen zu ersetzende Zeichen als Parameter an das Programm übergeben kann.
1 Kommentare
9 Lösung(en)
#!/usr/bin/env python3
import os, sys, getopt
def show_usage():
print("""\
Usage: rmp.py [OPTION]
Remove all dots from file or files within a directory except extention dot.
-h Display the usage message.
-f file Path to the file where all dots will be remove.
-d directory Path to the directory where all dots will be removed.
""")
def main(argv):
try:
opts, args = getopt.getopt(argv,"hf:d:")
except getopt.GetoptError:
show_usage()
sys.exit(1)
for opt, arg in opts:
if opt in ('-h', '--help'):
show_usage()
sys.exit(0)
elif opt in ('-f', '--file'):
path = arg
kind = opt[1]
elif opt in ('-d', '--directory'):
path = arg
kind = opt[1]
if kind == 'd':
dir = os.listdir(path)
for file in dir:
newfile = file.replace('.', ' ', file.count('.')-1)
print(file + ' -> ' + newfile)
os.rename(file, newfile)
elif kind == 'f':
file = path
newfile = file.replace('.', ' ', file.count('.')-1)
print(file + ' -> ' + newfile)
os.rename(file, newfile)
if __name__ == "__main__":
main(sys.argv[1:])
Lösung von: Matthias Sayler (Bosch)
import java.util.Scanner;
import java.util.regex.Pattern;
public class Class {
// trennt den Dateipfad bei jedem enthaltenem splitter und löscht diesen
private String[] split(String datapath, String splitter) {
return datapath.split(Pattern.quote(splitter));
}
// Hauptmethode
public static void main(String[] args) {
// Dateipfad wird abgefragt und eingelesen
System.out.println("Geben Sie den Pfad an:");
String datapath = new Scanner(System.in).nextLine();
// Trennzeichen wird eingelesen und array wird mit dem zerteilten
// Dateipfad bestückt
System.out.println("Geben Sie das Trennzeichen an:");
String[] array = new Class().split(datapath, new Scanner(System.in).nextLine());
// enthällt am Ende den neuen String
String str = "";
// fügt Leerzeichen ein
for (int i = 0; i < array.length - 2; i++) {
array[i] = array[i] + " ";
}
// fügt den Punkt vor dem Dateiende an
if (array.length != 1) {
array[array.length - 1] = "." + array[array.length - 1];
}
// stellt den neuen String her
for (int i = 0; i < array.length; i++) {
str = str + array[i];
}
// gibt das Ergebniss aus
System.out.println(str);
}
}
Lösung von: Sebastian Littel ()
package programmierenuebungen;
import java.util.Scanner;
/**
*
* @author MadDeer
*
* TestString: Hallo-dies/ist,ein;Test_der.neuen.Software.txt
*
*/
public class replaceDotses {
//kann direkt in der main-Methode gemacht werden
public static void main (String[] args){
//Benutzereingabe holen
Scanner scanner = new Scanner(System.in);
System.out.print("Bitte geben Sie den String an: ");
String dateiname = scanner.nextLine();
//Ueberfluessige Zeichen entfernen
try{
dateiname = dateiname.replaceAll("/", " ");
} catch (Exception e){/*Nothing to do*/}
try{
dateiname = dateiname.replaceAll(",", " ");
} catch (Exception e){/*Nothing to do*/}
try{
dateiname = dateiname.replaceAll(";", " ");
} catch (Exception e){/*Nothing to do*/}
try{
dateiname = dateiname.replaceAll("-", " ");
} catch (Exception e){/*Nothing to do*/}
try{
dateiname = dateiname.replaceAll("_", " ");
} catch (Exception e){/*Nothing to do*/}
//Trennen nach Dateiendung und Rest
String name = dateiname.substring(0,dateiname.lastIndexOf("."));
try{
name = name.replaceAll("\\.", " ");
} catch (Exception e){/*Nothing to do*/}
//Ausgabe
System.out.println("Ausgabe: " + name + dateiname.substring(dateiname.lastIndexOf(".")));
}
}
Lösung von: Mad Deer (FH Ulm)
open System
let replaceFilename (filename : string) (rc : string) =
let _ext =
let _fl = filename.LastIndexOf(".")
if _fl >= 0 then
filename.Substring(_fl, filename.Length - _fl)
else ""
let _filename =
filename.Substring(0, filename.Length - _ext.Length)
_filename.Replace((char rc), ' ') + _ext
Console.Write "Replace Char: "
let fName = Console.ReadLine()
Console.Write "Filename: "
let rChr = Console.ReadLine()
replaceFilename fName rChr
Lösung von: Vural Acar ()
function replaceDotsSaveLast(str, chr) {
chr = chr || " ";
var lio = str.lastIndexOf(".");
str = str.replace(/\./g, chr);
str = str.substring(0, lio) + "." + str.substring(lio+1, str.length-1);
return str;
}
console.log(replaceDotsSaveLast("Das.ist.ein.Test.txt"));
console.log(replaceDotsSaveLast("Das.ist.ein.Test.txt", "-"));
// lissalanda@gmx.at
Lösung von: Lisa Salander (Heidi-Klum-Gymnasium Bottrop)
// NET 6.x | C# 10.x | VS-2022
static string ReplaceCharsExceptLast(string str, char newChr = ' ')
{
var index = str.LastIndexOf('.');
var chrArr = str.Replace('.', newChr).ToCharArray();
if (index > -1) chrArr[index] = '.';
return new string(chrArr);
}
Console.WriteLine(ReplaceCharsExceptLast("Das.ist.ein.Text.txt"));
Console.WriteLine(ReplaceCharsExceptLast("Das.ist.ein.Text.txt", '_'));
Lösung von: Jens Kelm (@JKooP)
// C++ 17
#include <iostream>
#include <string>
#include <algorithm>
void replace_chars_except_last(std::string& str, const char chr = ' ') {
const auto idx{ distance(std::find(str.rbegin(), str.rend(), '.'), str.rend()) - 1 };
std::replace(str.begin(), str.end(), '.', chr);
if (idx > -1) str[idx] = '.';
}
int main() {
std::string t{ "Das.ist.ein.Text.txt" };
replace_chars_except_last(t);
std::cout << t << "\n";
}
Lösung von: Jens Kelm (@JKooP)
// C++ 20 | VS-2022
#include <iostream>
#include <algorithm>
#include <ranges>
#include <vector>
struct File {
std::string name;
char replace_char = ' ';
};
static const auto replace_dots_except_last(const File& file_) {
auto filename{ file_.name };
const auto index{ file_.name.rfind('.')};
std::ranges::replace(filename, '.', file_.replace_char);
if (index != std::string::npos) filename.at(index) = '.';
return filename;
}
int main() {
std::vector<File>files{
{ "Das.ist.ein.Text.txt" }, // Das ist ein Text.txt
{ "Das.ist.eine.Tabelle.xls" }, // Das ist eine Tabelle.xls
{ "DasIstEinText.txt" }, // DasIstEinText.txt
{ "Das.ist.ein.Text.txt", '_' }, // Das_ist_ein_Text.txt
{ "Test" }, // Test
{ "Test txt", '-' } // Test txt
};
for (const auto& file : files)
std::cout << replace_dots_except_last(file) << "\n";
}
Lösung von: Jens Kelm (@JKooP)
#include <stdio.h>
int get_last_pos(char* str, unsigned size, char chr) {
for (unsigned i = size; i > 0; --i)
if (str[i] == chr)
return size - (size - i);
return -1;
}
void replace(char* str, unsigned size, char old_chr, char new_chr) {
for (unsigned i = 0; i < size; ++i)
if (str[i] == old_chr)
str[i] = new_chr;
}
int main() {
char txt[] = "Das.ist.ein.Text.txt";
unsigned size = sizeof(txt) / sizeof(txt[0]);
int last = get_last_pos(txt, size, '.');
if (last > - 1) {
replace(txt, size, '.', ' ');
txt[last] = '.';
}
printf("%s", txt);
}
Lösung von: Jens Kelm (@JKooP)
Verifikation/Checksumme:
Man kann es mit den Beispielen versuchen.
Aktionen
Neue Lösung hinzufügen
Bewertung
Durchschnittliche Bewertung:
Kommentare (1)
Daher ist die Aufgabe, so wie sie hier steht, sicher viel spannender. Wie entscheiden wir nämlich, was die Dateierweiterung ist bei Filenamen wie "XY.java", "File.2014_backup", '2443_###' und so weiter. Hier würde ich der Einfachheit halber schreiben: "Der Letzte Punkt (falls vorhanden) gehört zur Dateierweiterung und darf nicht ersetzt werden."