Tekstbestanden splitsen

(English below.)

Ik was op zoek naar een programmaatje dat txt-bestanden kan splitsen op gewenste plekken. Het volgende moet bijvoorbeeld worden gesplitst bij het woord CHECKPOINT:

-84.27,86.14,429.25,11350.17
-84.27,86.14,429.25,11350.19
CHECKPOINT
CHECKPOINT
-84.27,86.29,429.22,11350.20
-84.47,86.22,428.85,11350.22
CHECKPOINT
CHECKPOINT
-84.47,86.22,428.85,11350.23
...

en zal 3 bestanden moeten opleveren met de verschillende getallenreeksen en niet de woorden CHECKPOINT.

Bij mijn zoektocht vond ik echter alleen maar programma’s die tekstbestanden op grootte kunnen splitsen, dus heb ik zelf een programmaatje bedacht. Voor iedereen die hetzelfde zoekt maar niet kan vinden, hier een mogelijke oplossing (eerst in pseudocode):

% variabelen initialiseren:
NUMMER=1 % regelnummer
XX=0 % achtervoegsel voor nieuwe bestanden, bv. bestand1.txt

while(NUMMER < length(bron.txt)) % zolang er regels zijn if(length(regel(NUMMER)) < 11) % als de huidige regel korter is dan 11 tekens (bv. het woord 'checkpoint') check=1 % deze variabele geeft aan dat je bij een checkpoint bent else % als de regel langer is dan 10 tekens if(check=1) % en de vorige regel was een checkpoint en de huidige niet XX++ % bestandsnummer ophogen check=0 % je bent niet bij een checkpoint end ... % voeg nu de huidige regel toe aan bronXX.txt (als nieuwe regel zonder anderen te overschrijven. XX is een getal in de bestandsnaam) end NUMMER++ % ga naar volgende regel end

In C-sharp (C#) ziet dit programma er als volgt uit (alleen nog even wijzigen dat hij vraagt om de bestandsnaam, in plaats van om standaard output.txt te gebruiken):

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Text.RegularExpressions;

namespace ConsoleApplication1 {
class Program {
static void Main(string[] args) {
bool isNewFile = true;
bool isFileClosed = true;
int fileNum = 0;
string outputFileName = String.Concat("C:\\output", fileNum, ".txt");
StreamWriter SW = null; // new StreamWriter(outputFileName);
string w;
string line = "";
using (StreamReader sr = new StreamReader("C:\\output.txt")) {
while ((line = sr.ReadLine()) != null) {
w = line.Substring(0,10);// (sentence, @"\W");
if (w != "CHECKPOINT") {
if (isNewFile) {
outputFileName = String.Concat("C:\\output", fileNum, ".txt");
fileNum++;
SW = new StreamWriter(outputFileName);
isNewFile = false;
isFileClosed = false;
}
SW.WriteLine(line);
} else {
isNewFile = true;
if (!isFileClosed) {
SW.Close();
isFileClosed = true;
}
}
}
}
}
}
}

(Om C# uit te kunnen voeren, heb je Visual Studio nodig.)

For English readers
I was looking for a program that is able to split up txt-files at given lines (e.g. lines that start with CHECKPOINT or lines that have less than say 11 characters). The only programs I could find where programs that could split txt files by filesize, so I thought of this new program in pseudocode:

% variables:
NUMBER=1 % line number
XX=0 % new files get this number, e.g. file1.txt

while(NUMBER < length(source.txt)) if(length(line(NUMBER)) < 11) check=1 else if(check=1) % the previous line was short and the current line is not XX++ check=0 end add a new line to sourceXX.txt (new line without overwriting others. XX is again a number) end NUMBER++ % go to next line

This code is translated in C# above.

%d bloggers liken dit: