C# String.Split Frage

Magic1416

Lieutenant
Registriert
Dez. 2003
Beiträge
530
Hallo,

ich möchte mehrere Strings aus einem TextFile splitten und in Arrays speichern.

hier das Problem:

copy sourceFolder "Target Folder" /y

als Ergebnis brauche ich

copy
sourceFolder
Target Folder
/y

Mein Problem beim Split sind die Quoted Commas von dem Befehl. Ich kann nicht einfach beim Leerzeichen splitten. Das Ergebnis wäre das falsche. Mit welchen Ansatz gehe ich da richtig vor.

Danke Gruß Magic
 
Bau dir ne Funktion, die auf "Quoted Commas"(? Anführungszeichen heißen "quotes") prüft und entsprechend trennt. Sollte man in wenigen Minuten mit kurzem Überlegen schaffen.
 
Hi,

ich denke es gibt viele Lösungen.
Aber mit einem einfachen Split bei Leerzeichen geht es ja nicht, weil sonst der Targetfolder-String ja getrennt wird.
Die Art der Lösung hängt vorallem davon ab, wie genau der Eingabe-String definiert ist.
Je nachdem wäre eine Lösung mittels RegEx möglich.
Hier ein eher simpler Ansatz

Code:
            string test = "copy sourceFolder \"Target Folder\" /y";
            int AfterCommand = test.IndexOf(' ');
            int AfterSourceFolder= test.IndexOf('"') ;
            int AfterTargetFolder= test.LastIndexOf('"') ;
            string command = test.Substring(0, test.IndexOf(' '));
            string sourceFolder = test.Substring(AfterCommand, AfterSourceFolder - AfterCommand);
            string TargetFolder = test.Substring(AfterSourceFolder+1, AfterTargetFolder  - AfterSourceFolder -1);
            string Param = test.Substring(AfterTargetFolder+1); Anführungszeichen


Edit: Du könntest auch erst, wie Yuuri meinte, bei den Anführunszeichen trennen (mittels Split()). Somit erhälst Du drei Elemente. das erste musst Du dann noch beim Leerzeichen trennen und alles noch etwas trimmen...tada^^
 
Zuletzt bearbeitet:
Hi,

ich glaub ihr versteht mich falsch.
Der copy Befehl ist nur ein einfaches Beispiel um das Problem zu beschreiben. In dem Textfile stehen unterschiedliche CommandLine Befehle drin mit einer unterschiedlichen Anzahl an Argumenten.
An dieser Stelle kann man weder einfach am Leerzeichen trennen, noch an den Hochkommas. Es müssen die Argumente sauber getrennt und in Arrays geschrieben werden, unabhängig davon, welches Argument in Hochkommas eingefasst ist.
Ich habe gerade noch einen Ansatz mit einer WinApi Funktion gefunden. Diese heißt:

LPWSTR *CommandLineToArgvW( LPCWSTR lpCmdLine, int *pNumArgs);

mal sehen, was ich damit anfangen kann.

reiner Dot Net Code ist mir allerdings lieber.
 
Ja und wo ist da das Problem? Bastel dir ne Schleife, guck nach den Trennern und trenn selbst. Ist in wenigen Minuten selbst gemacht. Hab ich in ca. fünf Minuten selbst zusammengebastelt:
Code:
<?php

function MySplit( $String, $SplitChars = ' ', $DontSplitIn = '"' )
{
	$r = array();
	$strlen = strlen( $String );
	$lastpos = 0;
	$inSplit = false;

	$SplitChars = str_split( $SplitChars );
	$DontSplitInStr = $DontSplitIn;
	$DontSplitIn = str_split( $DontSplitIn );

	for( $i = 0; $i < $strlen; ++$i )
	{
		if( in_array( $String[$i], $DontSplitIn ) )
			$inSplit = !$inSplit;
		if( in_array( $String[$i], $SplitChars ) && !$inSplit )
		{
			$r[] = trim( substr( $String, $lastpos, $i - $lastpos ), $DontSplitInStr );
			$lastpos = $i + 1;
		}
	}
	$r[] = substr( $String, $lastpos );
	return $r;
}

echo '<pre>';
var_dump(
	MySplit( 'copy sourceFolder "Target Folder" /y' ),
	MySplit( 'copy sourceFolder "Target Folder mit ein paar leerzeichen" .und ein weiterer test mit anderem trenner. und der nächste test /y', ' ', '.' )
);
Code:
array(4) {
  [0]=>
  string(4) "copy"
  [1]=>
  string(12) "sourceFolder"
  [2]=>
  string(13) "Target Folder"
  [3]=>
  string(2) "/y"
}
array(14) {
  [0]=>
  string(4) "copy"
  [1]=>
  string(12) "sourceFolder"
  [2]=>
  string(7) ""Target"
  [3]=>
  string(6) "Folder"
  [4]=>
  string(3) "mit"
  [5]=>
  string(3) "ein"
  [6]=>
  string(4) "paar"
  [7]=>
  string(12) "leerzeichen""
  [8]=>
  string(41) "und ein weiterer test mit anderem trenner"
  [9]=>
  string(3) "und"
  [10]=>
  string(3) "der"
  [11]=>
  string(8) "nächste"
  [12]=>
  string(4) "test"
  [13]=>
  string(2) "/y"
}
 
Zurück
Oben