Text in mehrere, bestimmte Strings

Hey Leute,

ich habe eine .txt Datei die ich in meinem Programm auslese. An bestimmten Stellen wiederholt sich der Inhalt, es gibt sozusagen eine Überschrift, Inhalt, Ende… usw! Überschrift und Ende sind überall gleich.

Nun mein Problem:
Ich habe den kompletten Dateiinhalt in eine Liste geschrieben, nur fällt mir nicht ein, wie ich die Liste in mehrere Strings bekomme.

Das Ziel des ganzen:
Aus einer großen .txt Datei viele kleine machen, die alle aus 1x Überschrift, Inhalt, Ende bestehen.

Hat jemand eine Idee? Mit Regex geht es wohl, nur habe ich es nicht geschafft.

Grüße

Moin,

bin mir zwar nicht sicher, ob ich Deine Frage richtig vestanden habe, aber Du könntest Deinen Textinhalt doch einfach splitten (beispielsweise über die ‘gleichen’ Textinhalte) !

Gruß
Klaus

Wie würde das aussehen? Soll ich die Datei erst gar nicht einer Liste hinzufügen?

In sContent liegt der komplette Inhalt der Textdatei. Es wiederholen sich immer Überschrift und Ende, nur ich bekomme es nicht hin, mit diesen Informationen einzelne strings zu erzeugen.

[CSharp]
if (File.Exists(fullPathDesktop))
{
StreamReader reader = new StreamReader(fullPathDesktop, System.Text.Encoding.Default);
sContent = reader.ReadToEnd();
reader.Close();
}

        List<string> sentences = new List<string>();

        sentences.Add(sContent);

        Directory.CreateDirectory(newPathDesktop + "VCARDS");

[/CSharp]

Hallo iTz,

es ist mir noch nicht so ganz klar, wie die Textdatei organisiert ist. Stehen Überschrift, Inhalt und Ende jeweils in einer eigenen Zeile oder steht alles fortlaufend im Text? Woher weisst du, was Überschrift, Inhalt oder Text ist?

Gruß
albatros

Moin,

wenn Du in “sContent” den kompletten Text hast, kannst Du ihn doch nach Deinen Bedürfnissen teilen …

[QUOTE=albatros]Hallo iTz,
es ist mir noch nicht so ganz klar, wie die Textdatei organisiert ist. Stehen Überschrift, Inhalt und Ende jeweils in einer eigenen Zeile oder steht alles fortlaufend im Text? Woher weisst du, was Überschrift, Inhalt oder Text ist?
[/QUOTE]
genau, ohne die Struktur kann man nichts weiter sagen !

Gruß
Klaus

Alles klar, sorry dafür. So sieht ein Teil der Textdatei aus:

BEGIN:VCARD
VERSION:2.1
N:NameGeändert;Beate;;;
FN:Beate NameGeändert
TEL;CELL;PREF:+0190666666
END:VCARD

Ich möchte am Ende lauter einzelne Dateien in einem Verzeichnis mit Inhalt:

BEGIN:VCARD

Inhalt

END:VCARD

Könnt Ihr mir helfen?

Moin,

stehen die einzelenen Einträge direkt untereinander ?

Dann würde ich zwischen jeden “END:VCARD” und BEGIN:VCARD" irgendwelche Trennzeichen einfügen (ich nutze bspw. gerne sowas wie “##@@##”, über die dann gesplittet werden kann!

Gruß
Klaus

Ganz genau so sieht die Datei aus.

Ich verstehe nur nicht so ganz, wie das mit den Trennzeichen geht bzw. warum ich nur Zeichen angeben kann.

Ich lese mir schon das 2. Tut dazu durch, ich versteh nur nicht, wie das auf meinen Fall anwendbar sein soll.

Moin,

etwas so - Vorsicht: ist vHidT :smiley:

String s1 = "END:VCARD
BEGIN:VCARD";
String s2 = "END:VCARD
##@@##
BEGIN:VCARD";
String sContentNew = sContent.replaceAll( s1, s2 );

// und dann splitten:
Pattern p = Pattern.compile ( "##@@##" );
String[] strData = p.split(strBlock, 0x0);

Im StringArrary strData stehen dann jeweils die einzelnen Einträge!

Gruß
Klaus

Vielen Dank für deine Mühe, echt super von Dir.

Ich versuch es mal umzusetzen. :slight_smile:

Moin,

kein Problem - dann mal gute Verrichtung :o)

Gruß
Klaus

Da alles so schön zeilenweise aufgelistet ist: Einfach die Datei mit File.ReadAllLines() komplett einlesen. Damit bekommst du ein String-Array mit den Zeilen, über das du nur eine Schleife laufen lässt. Bei BEGIN:VCARD dann jeweils eine neue Textdatei erstellen und alle Zeilen bis END:VCARD dort reinschreiben.

Gruß
albatros

Moin,

[QUOTE=albatros]Da alles so schön zeilenweise aufgelistet ist: Einfach die Datei mit File.ReadAllLines() komplett einlesen. Damit bekommst du ein String-Array mit den Zeilen, über das du nur eine Schleife laufen lässt. Bei BEGIN:VCARD dann jeweils eine neue Textdatei erstellen und alle Zeilen bis END:VCARD dort reinschreiben.
[/QUOTE]
oder so :smiley:

Das hat dann aber bei etwa 10.000 Einträgen den Nnachteil, dass man dabei auch 10.000 Textdateien erstellen würde … will man das wirklich ??

Gruß
Klaus

So habe ich jedenfalls die Anforderung verstanden:

[QUOTE=iTz;21151]
Das Ziel des ganzen:
Aus einer großen .txt Datei viele kleine machen, die alle aus 1x Überschrift, Inhalt, Ende bestehen.[/QUOTE]

Gruß
albatros

Moin,

Ja, ok, hast Recht … ::manklatsch

Es ist wohl doch zu warm :sick:

Gruß
Klaus

Ich bekomm das if Statement nicht hin :frowning:

Wie kann ich nach VCARD:BEGIN und VCARD:END abfragen? Daraus dann eine Text-Datei erstellen bekomm ich hin, nur ich komm nicht mal dahin.

[CSharp]string systemPath = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
string desktopPath = „Desktop“;
string fullPathDesktop = Path.Combine(systemPath, desktopPath);
string newPathDesktop = Path.Combine(systemPath, desktopPath);
string dialogInput = string.Empty;
OpenFileDialog dialog = new OpenFileDialog();
dialog.Filter = „.vcf)|.vcf|All files (.)|.“;
dialog.InitialDirectory = fullPathDesktop;
dialog.Title = „vcf Datei auswählen“;
if (dialog.ShowDialog() == DialogResult.OK)
fullPathDesktop = dialog.FileName;
string[] zeilen = new string[10000000];
if (File.Exists(fullPathDesktop))
{
zeilen = File.ReadAllLines(fullPathDesktop);
}
//if statement
using (StreamWriter writer = File.CreateText(newPathDesktop + „VCARDS“))
{
writer.WriteLine();
writer.Flush();
writer.Close();
}[/CSharp]

Etwa so:
[csharp]
if (File.Exists(fullPathDesktop))
{
string [] zeilen = File.ReadAllLines(fullPathDesktop);

foreach( string s in zeilen )
{
    if( s.StartsWith("BEGIN:VCARD") )
    {
        // Datei anlegen, Zeile schreiben
    } 
    else if( s.StartsWith("END:VCARD") )
    {
        // Datei angelegt? -> wenn ja Zeile schreiben, Datei schliessen
    }
    else
    {
        // Datei angelegt? -> wenn ja Zeile schreiben
    }
}

}
[/csharp]
Gruß
albatros