Avatar billede shale Nybegynder
29. juli 2003 - 10:51 Der er 16 kommentarer

Hjælp med sortering af liste fra en fil

C10
C11
C12
C13
C14
C15
C16
C17
C18
C1
C19
C20
C24
C26
C27
C28
C2
C29
C30
C31
C3
C32
C33
C34
C35
C36
C37
C38
C40
C4
C41
C42
C5
C6
C7
C8
C9
D1
D2
D3
D4
D5
D6
D7
IC1
IC2
IC3
P66
P67
P68
R10
R11
R116
R12
R13
R1
R14
R15
R16
R17
R18
R19
R20
R21
R22
R23
R24
R2
R25
R26
R27
R28
R29
R30
R31
R32
R3
R33
R34
R35
R36
R37
R38
R39
R40
R41
R42
R43
R44
R4
R45
R46
R47
R48
R49
R50
R51
R52
R53
R54
R5
R55
R6
R7
R8
R9
TR1
TR2
TR3
TR4
TR5
TR6
TR7
TR8

-----

Denne liste er lagt i et array fra en anden usorteret fil og derefter sorteret på denne måde, men sort funktionen i perl laver den fejl at den ikke indsætter tallene under 10 de rigtige steder hvor tal over 10 i hver bogstavgruppe forekommer.

Jeg vil lige høre om der er nogen der ved hvordan jeg får det lavet sådan at f.eks. C1, C2, C3, C4, osv. kommer til at stå rigtigt i listen. i stedet for.

Der skulle jo gerne stå:

C1
C2
C3
C4
C5
C6
C7
C8
C9
C10
C11
osv osv osv...
Avatar billede mahler Nybegynder
29. juli 2003 - 10:56 #1
Ville det være et problem at skrive 01, 02, 03, ...?

Hvis det er det, så er jeg bange for, at løsningen nok er at splitte hvert element, og så sortere først bogstaverne i rækkefølge og efterfølgende tallene inden for hvert enkelt bogstav.
Avatar billede shale Nybegynder
29. juli 2003 - 10:59 #2
Ja det er et problem :/

Listen bliver genereret fra et andet program og skal se sådan ud da det ellers ikke kan bruges senere.

Listen er desuen dynamisk og jeg kan derfor ikke vide fx hvilke bogstaver der optræder.
Avatar billede erikjacobsen Ekspert
29. juli 2003 - 11:12 #3
@a=('C15','C16','C17','C18','C1','C19','C20','D24','C26','C27','C28','C2','C29','D30','C31');

sub sml {
  my ($a,$b)=@_;
  $a=~/^(.)(\d+)/; $a1=$1; $a2=$2;
  $b=~/^(.)(\d+)/; $b1=$1; $b2=$2;

  if ($a1 lt $b1) {
    return -1;
  } elsif ($a1 gt $b1) {
    return 1;
  } else {
    return $a2<=>$b2;
  }
}


@b=sort { sml($a,$b) } @a;

print join(" - ",@b);
Avatar billede shale Nybegynder
30. juli 2003 - 11:12 #4
Undskyld min høje respons tid Erik.

Hvis jeg nu har et 2 dim. array så der er koblet et ekstra nummer til hvert af de ovenstående i listen, hvordan fixer jeg så det?
Avatar billede erikjacobsen Ekspert
30. juli 2003 - 12:14 #5
Vis lige hvordan det ser ud - så længe du reagerer inden jeg går på pension, så er det fint nok.
Avatar billede shale Nybegynder
30. juli 2003 - 12:43 #6
Haha good one :D

open(INPUTFILE, "<$ARGV[2]") || die "Error opening input BOM file: $ARGV[2]\n$!";
@inputarray = <INPUTFILE>;
close(file);

open(OUTPUTFILE, ">>$ARGV[0]") || die "Error opening output BOM file: $ARGV[0]\n$!";
shift @inputarray;
pop @inputarray;
pop @inputarray;

$i=0;
foreach (@inputarray)
{
  @values=split(/\s*,\s*/, $_);
  if ($values[2]!="[0-9]")
      {
    $tabel{sprintf("%-10d%s%d", $values[1], $values[1], $i)}=sprintf("%-6sA %-9s 0    0 P      0    0    0\n", $values[1], $values[2]);
        }
    else
    {
        $errors{sprintf("%-10d%s%d", $values[1], $values[1], $i)}=sprintf("%-6s med Part Number = %-9s fjernet fra BOM pga. ikke-numerisk Part Number\n", $values[1], $values[2]);
    }
  $i++;   
}

foreach (keys %tabel)  {
  print OUTPUTFILE $tabel{$_};
}

----

Forklaring:

En linie fra <INPUTFILE> ser f.eks. således ud:
1    ,C4,4201163  ,                                 
C4 bliver så sat i values[1] og 4201163 bliver sat i values[2]

Derefter skal den printe arrayet ud igen i <OUTPUTFILE> og linjen skulle så gerne se sådan ud:
C4    A 4201163  0    0 P      0    0    0


Listen i mit øverste indlæg er values[1]
Jeg vil gerne have at det der bliver udskrevet i <OUTPUTFILE> bliver sorteret efter values[1] som du så pænt gjorde med svaret til min liste.
Avatar billede erikjacobsen Ekspert
30. juli 2003 - 13:25 #7
Jeg forstår ikke helt denne her:

if ($values[2]!="[0-9]")
Avatar billede shale Nybegynder
30. juli 2003 - 13:28 #8
Det behøver du heller ikke ^^
Avatar billede ranko Nybegynder
01. august 2003 - 11:31 #9
Måske menes der ( $values[2] !~ /[0-9]/ ) men den er kun sand hvis values[2] ikke indeholder cifre.
Hvis $values[2] altid kun indeholder cifre og det skal give fejl når dette ikke er tilfældet vil ( $values[2] =~ /^\d+$/ ) gøre jobbet.
Avatar billede shale Nybegynder
01. august 2003 - 11:40 #10
Hehe nice nok ranko....... Jeg havde faktisk selv undret mig meget over den sætning der da jeg lavede den, men den virker som den skal (underligt nok)
Avatar billede erikjacobsen Ekspert
01. august 2003 - 11:44 #11
Den virker ikke. Den er sikkert altid sand, da der aldrig står præcis
"[0-9]". Det var sådan set bare fordi jeg troede, der var noget du ikke
havde fortalt mig.
Avatar billede shale Nybegynder
01. august 2003 - 11:47 #12
sand sætning:
P67  A 7210689  0    0 P      0    0    0

falsk sætning:
FP9    med Part Number = FTP      fjernet fra BOM pga. ikke-numerisk Part Number


Og det gør den tilsyneladende rigtig med alle kombinationer jeg smider ind
Avatar billede erikjacobsen Ekspert
01. august 2003 - 11:50 #13
nej, det gør den ikke - men det kan være resten af dit program retter op på det
Avatar billede shale Nybegynder
01. august 2003 - 11:52 #14
Ja den indsætter dem i en anden fil, men det valgte jeg at undlade her fordi det er irellevant for mit spørgsmål
Avatar billede erikjacobsen Ekspert
01. august 2003 - 11:56 #15
Du må gerne synes det er irrelevant.

Er du venlig at afvise mit svar, så andre kan få chancen.
Avatar billede ranko Nybegynder
01. august 2003 - 12:20 #16
!= er nummerisk ulighed - højreside er altid nummerisk 0 så sætningen er kun falsk når $values[2] er nummerisk 0 dvs f.eks. når den er tom
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester