Heeft me 2 uur en 4 minuutjes gekost.. maar dan heb je ook wat he ! ;) :)
Hier komt ie:
// *** Begin of Program ***
program Resched;
{$APPTYPE CONSOLE}
{
Re-Schedule example for "Radio" scheduling.
Version 0.01 and 0.02 created on 8 december 2009 by Skybuck Flying ! ;)
Compiles/Builds/Works with Delphi 2007 and FreePascal 2.2.4 For Win32.
input.txt example:
0800-1300;....data.....
1300-1700;....data.....
1800-1830;....data.....
0200-0257;....data.....
0400-0457;....data.....
0000-0300;....data.....
0600-0657;....data.....
0700-0900;....data.....
1000-1057;....data.....
1100-1157;....data.....
2130-0830:....data.....
1130-0500:....data.....
0000-2400:....data.....
0000-2359:....data.....
2400-0000:....data.....
2359-0001:....data.....
output.txt example:
0800-0900;....data.....
0900-1000;....data.....
1000-1100;....data.....
1100-1200;....data.....
1200-1300;....data.....
1300-1400;....data.....
1400-1500;....data.....
1500-1600;....data.....
1600-1700;....data.....
1800-1830;....data.....
0200-0257;....data.....
0400-0457;....data.....
0000-0100;....data.....
0100-0200;....data.....
0200-0300;....data.....
0600-0657;....data.....
0700-0800;....data.....
0800-0900;....data.....
1000-1057;....data.....
1100-1157;....data.....
2130-2200:....data.....
2200-2300:....data.....
2300-2400:....data.....
0000-0100:....data.....
0100-0200:....data.....
0200-0300:....data.....
0300-0400:....data.....
0400-0500:....data.....
0500-0600:....data.....
0600-0700:....data.....
0700-0830:....data.....
1130-1200:....data.....
1200-1300:....data.....
1300-1400:....data.....
1400-1500:....data.....
1500-1600:....data.....
1600-1700:....data.....
1700-1800:....data.....
1800-1900:....data.....
1900-2000:....data.....
2000-2100:....data.....
2100-2200:....data.....
2200-2300:....data.....
2300-2400:....data.....
0000-0100:....data.....
0100-0200:....data.....
0200-0300:....data.....
0300-0400:....data.....
0400-0500:....data.....
0000-0100:....data.....
0100-0200:....data.....
0200-0300:....data.....
0300-0400:....data.....
0400-0500:....data.....
0500-0600:....data.....
0600-0700:....data.....
0700-0800:....data.....
0800-0900:....data.....
0900-1000:....data.....
1000-1100:....data.....
1100-1200:....data.....
1200-1300:....data.....
1300-1400:....data.....
1400-1500:....data.....
1500-1600:....data.....
1600-1700:....data.....
1700-1800:....data.....
1800-1900:....data.....
1900-2000:....data.....
2000-2100:....data.....
2100-2200:....data.....
2200-2300:....data.....
2300-2400:....data.....
0000-0100:....data.....
0100-0200:....data.....
0200-0300:....data.....
0300-0400:....data.....
0400-0500:....data.....
0500-0600:....data.....
0600-0700:....data.....
0700-0800:....data.....
0800-0900:....data.....
0900-1000:....data.....
1000-1100:....data.....
1100-1200:....data.....
1200-1300:....data.....
1300-1400:....data.....
1400-1500:....data.....
1500-1600:....data.....
1600-1700:....data.....
1700-1800:....data.....
1800-1900:....data.....
1900-2000:....data.....
2000-2100:....data.....
2100-2200:....data.....
2200-2359:....data.....
2400-0000:....data.....
2359-0001:....data.....
}
uses
SysUtils;
function ExtractString
(
ParaInputString : string;
ParaStartIndex : integer;
ParaStopIndex : integer
) : string;
var
vIndex : integer;
begin
result := '';
for vIndex := ParaStartIndex to ParaStopIndex do
begin
if (vIndex >= 1) and (vIndex <= Length(ParaInputString)) then
begin
result := result + ParaInputString[vIndex];
end;
end;
end;
function ConvertCharToDigit( ParaChar : char ) : integer;
const
ConstDigitValue : array['0'..'9'] of integer =
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
begin
result := 0;
if (ParaChar >= '0') and (ParaChar <= '9') then
begin
result := ConstDigitValue[ParaChar];
end;
end;
function ConvertStringToValue
(
ParaString : string
) : integer;
var
vIndex : integer;
vPosition : integer;
begin
result := 0;
vPosition := 1;
for vIndex := 1 to Length(ParaString) do
begin
result := result +
ConvertCharToDigit
(
ParaString[(Length(ParaString)-vIndex)+1]
) * vPosition;
vPosition := vPosition * 10;
end;
end;
procedure SwapIntegers( var ParaA : integer; var ParaB : integer );
var
vTemp : integer;
begin
vTemp := ParaA;
ParaA := ParaB;
ParaB := vTemp;
end;
function ConvertIntegerToHourString( ParaInteger : integer ) : string;
const
ConstDigitChar : array[0..9] of char =
('0','1','2','3','4','5','6','7','8','9');
begin
result :=
ConstDigitChar[(ParaInteger div 1000) mod 10] +
ConstDigitChar[(ParaInteger div 100) mod 10] +
ConstDigitChar[(ParaInteger div 10) mod 10] +
ConstDigitChar[(ParaInteger div 1) mod 10];
end;
procedure ReSchedule( ParaInputString : string; var ParaOutputFile : text );
var
vStartString : string;
vDashString : string;
vStopString : string;
vSemiColonString : string;
vDataString : string;
vStart : integer;
vStop : integer;
vStartHour : integer;
// vStartMinutes : integer;
vStopHour : integer;
// vStopMinutes : integer;
vHour : integer;
vCompensate : boolean;
vOutputString : string;
begin
vStartString := ExtractString( ParaInputString, 1, 4 );
vDashString := ExtractString( ParaInputString, 5, 5 );
vStopString := ExtractString( ParaInputString, 6, 9 );
vSemiColonString := ExtractString( ParaInputString, 10, 10 );
vDataString := ExtractString( ParaInputString, 11,
Length(ParaInputString) );
vStart := ConvertStringToValue( vStartString );
vStop := ConvertStringToValue( vStopString );
vStartHour := vStart div 100;
// vStartMinutes := vStart mod 100; // not needed
vStopHour := vStop div 100;
// vStopMinutes := vStop mod 100; // not needed
vCompensate := false;
if vStartHour > vStopHour then
begin
// compensate for wrap around
vStopHour := vStopHour + 24;
vCompensate := true;
end;
// debug strings
// writeln( ParaInputString );
// writeln( 'output: ', vStartString, vDashString, vStopString,
vSemiColonString, vDataString );
// writeln( 'converted: ', vStart, ' ', vStop );
// writeln( 'determined: ', vStartHour, ' ', vStartMinutes, ' ', vStopHour,
' ', vStopMinutes );
if (vStopHour - vStartHour) = 0 then
begin
// debug strings
// writeln( 'schedule: ', ParaInputString );
// output to file
writeln( ParaOutputFile, ParaInputString );
end else
begin
for vHour := vStartHour to vStopHour-1 do
begin
vOutputString := '';
if vHour = vStartHour then
begin
// start hour + start minutes
vOutputString := vOutputString + vStartString;
end else
begin
if vCompensate then
begin
// intermediate hour (wrapped back/compensated)
vOutputString := vOutputString +
ConvertIntegerToHourString((vHour mod 24)*100);
end else
begin
// intermediate hour
vOutputString := vOutputString +
ConvertIntegerToHourString(vHour*100);
end;
end;
vOutputString := vOutputString + vDashString;
if (vHour+1) = vStopHour then
begin
// stop hour + stop minutes
vOutputString := vOutputString + vStopString;
end else
begin
if vCompensate then
begin
// intermediate hour (wrapped back/compensated)
vOutputString := vOutputString +
ConvertIntegerToHourString(((vHour mod 24)+1)*100);
end else
begin
// intermediate hour
vOutputString := vOutputString +
ConvertIntegerToHourString((vHour+1)*100);
end;
end;
vOutputString := vOutputString + vSemiColonString;
vOutputString := vOutputString + vDataString;
// debug strings
// writeln( 'schedule: ', vOutputString );
// output to file
writeln( ParaOutputFile, vOutputString );
end;
end;
end;
procedure DisplayUsage;
begin
writeln('Radio re-scheduling program.');
writeln('Version 0.02 created on 8 december 2009 by Skybuck Flying.');
writeln;
writeln('Usage: ');
writeln(' resched.exe <input filename> <output filename>');
writeln;
writeln('Example: ');
writeln(' resched.exe input.txt output.txt');
writeln;
end;
procedure ProgramMain;
var
vInputFile : text;
vOutputFile : text;
vInputFilename : string;
vOutputFilename : string;
vInputString : string;
begin
if ParamCount < 2 then
begin
DisplayUsage;
exit;
end;
vInputFileName := ParamStr(1);
vOutputFileName := ParamStr(2);
// debug code
// writeln( 'Input filename: ', vInputFileName );
// writeln( 'Output filename: ', vOutputFileName );
// readln;
// exit;
write('Re-scheduling ' + vInputFilename + ' to ' + vOutputFilename + ' ');
// if compiler error then replace Assign with AssignFile or vice versa.
Assign( vInputFile, vInputFilename );
Assign( vOutputFile, vOutputFilename );
Reset(vInputFile);
Rewrite(vOutputFile);
while not EoF( vInputFile ) do
begin
ReadLn( vInputFile, vInputString );
ReSchedule( vInputString, vOutputFile );
end;
// if compiler error then replace Close with CloseFile or vice versa.
Close( vInputFile );
Close( vOutputFile );
writeln( 'done.');
end;
begin
try
ProgramMain;
except
on E:Exception do
Writeln(E.Classname, ': ', E.Message);
end;
ReadLn;
end.
// *** End of Program ***
Bye,
Skybuck.
Het enigste andere wat ik er nog even over wil zeggen is:
Haal de readln helemaal op het einde weg (vlak voor de "end.") (zodat het
programma niet wacht op een enter commando...) en dan kan het gebruikt
worden in batchfiles bijvoorbeeld:
Resched Input1.txt Output1.txt
Resched Input2.txt Output2.txt
Resched Dit.txt Dat.txt
Tot slot:
Het programma kan gemaakt/gebuild worden met Delphi 2007
(demo's/trial's/free editions) of Free Pascal (gratis !)
Doei,
Skybuck ! ;) :)
> output.txt example:
..
> 0700-0830:....data.....
..
> 2200-2359:....data.....
..
> 2359-0001:....data.....
Ik zou er nog een minuutje tegenaan gooien ... ;-)
--
Wil
Inderdaad, er zat nog een kleine bug in ! ;)
(Goed dat jij het zag ! ;):))
Bug opgelost, versie 0.03:
// *** Begin of Program ***
program Resched;
{$APPTYPE CONSOLE}
{
Re-Schedule example for "Radio" scheduling.
Version 0.01, 0.02, 0.03 created on 8 december 2009 by Skybuck Flying ! ;)
Compiles/Builds/Works with Delphi 2007 and FreePascal 2.2.4 For Win32.
input.txt example:
0800-1300;....data.....
1300-1700;....data.....
1800-1830;....data.....
0200-0257;....data.....
0400-0457;....data.....
0000-0300;....data.....
0600-0657;....data.....
0700-0900;....data.....
1000-1057;....data.....
1100-1157;....data.....
2130-0830:....data.....
1130-0500:....data.....
0540-0780:....data..... // new test data
output.txt example:
2300-0000:....data.....
0000-0100:....data.....
0100-0200:....data.....
0200-0300:....data.....
0300-0400:....data.....
0400-0500:....data.....
0500-0600:....data.....
0600-0700:....data.....
0700-0800:....data.....
0800-0830:....data.....
1130-1200:....data.....
1200-1300:....data.....
1300-1400:....data.....
1400-1500:....data.....
1500-1600:....data.....
1600-1700:....data.....
1700-1800:....data.....
1800-1900:....data.....
1900-2000:....data.....
2000-2100:....data.....
2100-2200:....data.....
2200-2300:....data.....
2300-0000:....data.....
0000-0100:....data.....
0100-0200:....data.....
0200-0300:....data.....
0300-0400:....data.....
0400-0500:....data.....
0540-0600:....data.....
0600-0700:....data.....
0700-0780:....data.....
2200-2300:....data.....
2300-2359:....data.....
2400-0000:....data.....
2359-0000:....data.....
0000-0001:....data.....
}
uses
SysUtils;
begin
result := '';
vStart : integer;
vStop : integer;
vStopHour : integer;
vStopMinutes : integer;
vHour : integer;
vCompensate : boolean;
vOutputString : string;
begin
vStartString := ExtractString( ParaInputString, 1, 4 );
vDashString := ExtractString( ParaInputString, 5, 5 );
vStopString := ExtractString( ParaInputString, 6, 9 );
vSemiColonString := ExtractString( ParaInputString, 10, 10 );
vDataString := ExtractString( ParaInputString, 11,
Length(ParaInputString) );
vStart := ConvertStringToValue( vStartString );
vStop := ConvertStringToValue( vStopString );
vStartHour := vStart div 100;
// vStartMinutes := vStart mod 100; // not needed
vStopHour := vStop div 100;
vStopMinutes := vStop mod 100;
if vStopMinutes > 0 then
begin
vStopHour := vStopHour + 1;
end;
ConvertIntegerToHourString(((vHour+1) mod 24)*100);
end else
begin
// intermediate hour
vOutputString := vOutputString +
ConvertIntegerToHourString((vHour+1)*100);
end;
end;
vInputFilename : string;
vOutputFilename : string;
Reset(vInputFile);
Rewrite(vOutputFile);
writeln( 'done.');
end;
// ReadLn;
end.
// *** End of Program ***
Doei,
Skybuck ! ;) :)
> 0540-0780:....data..... // new test data
7 huur en 80 minute kan natuurlijk niet... maarja.. het programma corrigeert
dit soort fouten niet want dan blijf je bezig met programmeren ;)
Zolang de input voor het programmatje correct is moet het nu toch werken ?!
;) :)
Doei,
Skybuck =D