Tekstbestanden splitsen

juli 20 0 Reacties Categorie: Handig

(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.

Schrijf een reactie

Commenter Gravatar

Spam protection by WP Captcha-Free

?>