• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst] alle kleingeschriebenen Zeichen in File löschen

framp

Moderator
Teammitglied
abgdf schrieb:
framp schrieb:
Da wo 9999999 steht immer sizeof(a) reinschreiben und die 10000000 kleinermachen. Dann funktionierts.
Guter Ansatz! Es sollte aber "sizeof(a) - 1" heißen:
Erklärung: Die letzte Stelle von a[] wird für das abschließende '\0' des Strings benötigt. Die Schleife soll nur höchstens bis vor dieses '\0' das Array füllen.
Good catch. Ich weiss schon warum ich ungern mit Strings in C arbeite :D
 

abgdf

Guru
Hallo nochmal,

meine C-Version liefert bei größeren Dateien tatsächlich "Schlangen" :(. Hab's nochmal in Perl möglichst dicht an der C-Version geschrieben. Da AFAICS keine Schlangen, und die erste Zeile wird auch ignoriert wie sie soll:
Code:
#!/usr/bin/perl

use warnings;
use strict;

if ($#ARGV < 0) {
    print "Usage: script.pl file.txt\n";
    exit();
}

open(FH1, "<$ARGV[0]") or die;
open(FH2, ">out.tmp") or die;

# Read and write first line without modifications:
my $a = <FH1>;
print FH2 $a;

$a = "";
my $i;
my $c;
my $x = 0;

while (!eof(FH1)) {

    for($i = 0; $i <= 1000000; $i ++) {

        $c = getc(FH1);

        if (!defined($c)) {
            last;
        }

        if ($x == 50) {
            $a .= "\n";
            $x = 0;
        }

        if ($c !~ m/[a-zN \n]/) {
            $a .= $c;
            $x++;
        }
   }

    print FH2 $a;
    $a = "";
}

close(FH1);
close(FH2);
Wie sagte Kernighan (das "k" in "awk") über C:
Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.
Ich denke, mit diesem Perl-Code sollte man ganz gut hinkommen (auch wenn er vielleicht etwas langsam ist).

Viele Grüße
 

abgdf

Guru
Ha!

Hab' den/einen Bug im C-Programm noch gefunden; auch das mit der ersten Zeile sollte jetzt hinhauen:
Code:
#include <stdio.h>
#include <ctype.h>

/* cutsmall.c: Compile with

   gcc -Wall -Wextra -ansi -pedantic -O3 cutsmall.c -o cutsmall

*/

int main(int argc, char **argv)
{
    FILE *fp1;
    FILE *fp2;

    char a[1000000];
    unsigned long int i;
    unsigned long int s;
    int x;
    int linel;
    double towhere;

    char c;

    if(argc < 2) {
        puts("Usage: cutsmall file.txt");
        return 1;
    }

    a[sizeof(a) - 1] = '\0';
    linel = 50;

    towhere = sizeof(a) - sizeof(a) / linel * 2;

    i = s = x = 0;

    if ((fp1 = fopen(argv[1], "r")) == NULL) {
        puts("Error opening file; probably file not found.");
        return 1;
    }

    if ((fp2 = fopen("out.tmp", "w")) == NULL) {
        puts("Error writing file.");
        return 1;
    }

    /* Reading and writing first line unchanged: */

    while (!feof(fp1)) {

        for (i = 0; i < towhere; i++) {

            c = fgetc(fp1);

            if (c == EOF || c == '\n') {
                break;
            }

            a[s] = c;
            s++;
        }

        a[s] = '\0';
        s = 0;

        fprintf(fp2, "%s", a);

        if (c == '\n') {
            fprintf(fp2, "%s", "\n");
            break;
        }
    }

    /* Main routine: */

    while (!feof(fp1)) {

        for (i = 0; i < towhere; i++) {

            c = fgetc(fp1);

            if (c == EOF) {
                break;
            }

            if(x == linel) {
                a[s] = '\n';
                s++;
                x = 0;
            }
            if(islower(c) == 0 && c != 'N' && isspace(c) == 0) {
                a[s] = c;
                s++;
                x++;
            }
        }
        a[s] = '\0';
        s = 0;
        fprintf(fp2, "%s", a);
    }

    fclose(fp1);
    fclose(fp2);

    return 0;
}
Viele Grüße
 
OP
G

gma

Member
Hallo,

ich denke, dass die C-Ansätze sicherlich zu etwas führen werden, aber irgendwie ist mir das auch etwas zu unsicher, ob ich tatsächlich alles so zurück bekomme, wie ices brauche.

Das oben beschriebene Programm readseq.jar funktioniert bei mir mittlerweile, nachdem ich es mit der Option java -cp readseq.jar -Xmx1000m run aufgerufen habe (vorher gab es heap size errors). Es ist zwar etwas langsam, aber ich denke ich schreibe mir jetzt ein kleines shellskript und lass es über Nacht laufen.

Auf jeden Fall nochmals vielen Dank für die Tips, zumindest bin ich auf den GEschmack gekommen, mir mal C etwas genauer anzuschauen.

gma
 
Oben