Autor Beitrag
Holonet
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Do 27.10.11 13:37 
Ich habe ein String-Array das Dateinamen enthält. Die sollen nun gesplittet werden, nämlich beim Punkt. Dafür ist ja die Split-Methode wie geschaffen:
msdn.microsoft.com/d...73y76a(v=vs.80).aspx

Allerdings funktioniert es nicht und ich verstehe auch nicht wirklich wie es funktionieren soll.
Mein Code sieht so aus:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
 internal void divideName()
        {
            int i = 0;
            foreach (string s in filesToConvert)
            {
                string[] split = filesToConvert[i].Split(new Char[] { '.' });
                i++;
            }
        }


Im Debug-Modus hab ich mir dann den Inhalt vom Array "split" angeschaut und es enthält nur Meta-Daten. Kann mir jemand sagen, was ich hier falsch angehe?


Zuletzt bearbeitet von Holonet am Fr 28.10.11 09:12, insgesamt 1-mal bearbeitet
mats74
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189
Erhaltene Danke: 26

Win 10
VS 2017/19, C++, C#
BeitragVerfasst: Do 27.10.11 14:22 
Hallo Holonet

In der foreach-Schleife erzeugt Du immer wieder ein neues Array.
Das wird so nicht funktionieren.
Ich würde den Code ein Bisschen vereinfachen:

ausblenden C#-Quelltext
1:
2:
3:
4:
String text = ".Irgend.ein.Text";
Char[] splitzeichen = { '.' };
String[] split = text.Split(splitzeichen, System.StringSplitOptions.None);
MessageBox.Show(split[1]);


Somit hast Du den Inhalt der Stringvariablen in ein Array gepackt.
Beachte die verschiedenen Überladungen der Split-Funktion.

_________________
Gruss
mats74
Holonet Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Do 27.10.11 14:33 
Hmm oke. Das mit dem immer wieder erzeugen leuchtet mir ein.

Aber meine Strings kommen aus einem Array. Ich kann die nicht einfach so in den Code schreiben.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 27.10.11 14:38 
Wofür ist i ? Dein zu splittender string ist in der foreach Schleife vorraussichtlich s.
Dir irgendwas zu raten ist gerade schwer was willst du denn nach dem splitten mit den Einzelteilen anfangen?
jg72
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 22



BeitragVerfasst: Do 27.10.11 14:39 
Hallo,

erstmal kannst Du Deinen Code dahingehend vereinfachen, dass Du die Laufvariable i entfernst, die brauchst Du durch die foreach-Schleife nicht:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
internal void divideName()
{
    foreach (string s in filesToConvert)
    {
        string[] split = s.Split(new Char[] { '.' });
    }
}

Dann solltest Du Dir darüber klar werden, was Du erreichen willst. Die Werte von split sind außerhalb der Schleife wieder weg. Du müsstest also entweder innerhalb der Schleife etwas mit den Teilen machen, oder die gesplitteten Teile anderweitig speichern.
mats74
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189
Erhaltene Danke: 26

Win 10
VS 2017/19, C++, C#
BeitragVerfasst: Do 27.10.11 14:46 
... dann kannst Du mit foreach-Schleife den gesamten String aus dem Array-String zusammensetzen.
ausblenden C#-Quelltext
1:
text += s.ToString();					

... dann die Split-Funktion ausführen und weiterverarbeiten.

_________________
Gruss
mats74
Holonet Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Do 27.10.11 14:54 
War wohl etwas wenig Background.

Also das gesamte Programm soll alle *.csv-Dateien die sich in einem bestimmbaren Verzeichnis befinden in *.asc umwandeln. Zwischen der Verzeichniswahl und dem konvertieren/umbenennen werden sie noch in eine checkedListBox geladen, wo der Anwender noch selektieren kann, welche *.csv konvertiert werden sollen.

filesToConvert ist ein String-Array das alle Dateinamen enthält, die umgewandelt werden soll. Von denen will ich nun die Dateiendung abschneiden und sie dann mit dem Verzeichnispfad, dem Dateinamen(ohne Endung) und ".asc" zusammensetzen um sie mit der File.Move-Methode dann zu verschieben.


i ist eine Laufvariable die den Arrayindex hochzählt.
s entspricht einem Array-Eintrag und ist somit der zu splittende String, ja.

ICh versteh nicht ganz was in "string[] split" sthen sollte, nachdem s.Split durchgeführt wurde. Man hat ja danach quasi zwei Strings. Einmal den Namen und einmal die Endung.
mats74
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189
Erhaltene Danke: 26

Win 10
VS 2017/19, C++, C#
BeitragVerfasst: Do 27.10.11 14:55 
... das sieht dann so aus:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
String[] deinarray = new String[3];
deinarray[0] = ".und.jetzt.";
deinarray[1] = ".gehts.aber.";
deinarray[2] = ".richtig.los.";

String text = "";
foreach (String s in deinarray)
{
    text += s.ToString();
}

Char[] splitzeichen = { '.' };
String[] split = text.Split(splitzeichen, System.StringSplitOptions.None);
MessageBox.Show(split[1] + "\n" + text);


... ups war ein Bisschen spät.

_________________
Gruss
mats74
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 27.10.11 15:07 
string.Split ist da eine Sackgasse. Dir ist klar das Punkte ein gültiges Zeichen in Dateinamen sind nicht nur zur MArkierung der Extension?

Du solltest dir die Methoden der Path Klasse ansehen.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
foreach (string csvPath in filesToConvert)
{
    string filename = Path.GetFileNameWithoutExtension(csvPath);
    string directory = Path.GetDirectoryName(csvPath); // oder eben ein andere Ordner

    string ascPath = Path.Combine(directory , filename + ".asc");
    File.Move(csvPath , ascPath);
}



Wenn du tatsächlich im selben Ordner die asc Dateien ablegen willst tut es auch ein noch einfacheres Path.ChangeExtension.

Für diesen Beitrag haben gedankt: Holonet
Holonet Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Fr 28.10.11 08:50 
Das mit der Path-Klasse hat reibungslos funktioniert. Danke.
Das sieht bei mir jetzt so aus:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
            foreach (string file in filesToConvert)
            {
                string csvPath = path + '\\' + file;
                string filename = Path.GetFileNameWithoutExtension(csvPath);
                string directory = Path.GetDirectoryName(csvPath);

                string ascPath = Path.Combine(directory, filename + ".asc");
                File.Copy(csvPath, ascPath);
            }


Ich habe zuerst allerdings '/' anstatt '\\' geschrieben. Das hat genauso funktioniert. Wieso? Das müsste doch einen Fehler geben, weil er die Datei nicht findet.

Ich verwende die Copy-Methode, da die original-Files erhalten werden sollen. Daher auch kein ChangeExtension.


EDIT: Hab mal den Namen des threads editiert, ist für ein allfällige spätere Suche wohl leichter zu finden jetzt
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 28.10.11 11:59 
Zitat:
Ich habe zuerst allerdngs '/' anstatt '\\' geschrieben. Das hat genauso funktioniert. Wieso? Das müsste doch einen Fehler geben, weil er die Datei nicht findet.


Die .NET API ist da relativ tolerant und verträgt beides. Du solltest aber nicht direkt selbst am Trennzeichen für Verzeichnisse hantieren. Im Codebeispiel ist ja auch schon die richtige vorgehensweise gezeigt. Um Pfade zusammenzusetzen nimm die Path.Combine Methode also auch für die csvPath Variable. Wenn du doch mal direkt das Trennzeichen brauchst benutze die Path.DirectorySeparatorChar Konstante.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 28.10.11 12:32 
user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
Die .NET API ist da relativ tolerant und verträgt beides.
.NET oder Windows? Dass das unter Windows keine Probleme macht, weiß ich, aber wie sieht es mit .NET (sprich Mono) unter Linux aus?
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 28.10.11 12:50 
Zitat:
.NET oder Windows?


Sagen wir .Net hat das ohne viel eigenes zutun von der WinAPI geerbt ;)

Zitat:
Dass das unter Windows keine Probleme macht, weiß ich, aber wie sieht es mit .NET (sprich Mono) unter Linux aus?


Keine Ahnung. Meine Vermutung wäre bei Mono auf Linux eher nein bei Mono auf Windows eher auch ja. Ich würde es auf diese Probleme aber erst gar nicht ankommen lassen und mich auf die Path Klasse verlassen. Die liefert immer das richtige egal in welchem Framework (Bugs mal ausgeschlossen).