Another update from ingydotnet^djgoku
This commit is contained in:
parent
91df62d461
commit
948b86eafa
7604 changed files with 108452 additions and 22726 deletions
|
|
@ -1,12 +1,10 @@
|
|||
The following data shows a few lines from the file readings.txt (as used in the [[Data Munging]] task).
|
||||
|
||||
The data comes from a pollution monitoring station with twenty four instruments monitoring twenty four aspects of pollution in the air. Periodically a record is added to the file constituting a line of 49 white-space separated fields, where white-space can be one or more space or tab characters.
|
||||
The following task concerns data that came from a pollution monitoring station with twenty-four instruments monitoring twenty-four aspects of pollution in the air. Periodically a record is added to the file, each record being a line of 49 fields separated by white-space, which can be one or more space or tab characters.
|
||||
|
||||
The fields (from the left) are:
|
||||
DATESTAMP [ VALUEn FLAGn ] * 24
|
||||
i.e. a datestamp followed by twenty four repetitions of a floating point instrument value and that instruments associated integer flag. Flag values are >= 1 if the instrument is working and < 1 if there is some problem with that instrument, in which case that instrument's value should be ignored.
|
||||
i.e. a datestamp followed by twenty-four repetitions of a floating-point instrument value and that instrument's associated integer flag. Flag values are >= 1 if the instrument is working and < 1 if there is some problem with it, in which case that instrument's value should be ignored.
|
||||
|
||||
A sample from the full data file [http://rosettacode.org/resources/readings.zip readings.txt] is:
|
||||
A sample from the full data file [http://rosettacode.org/resources/readings.zip readings.txt], which is also used in the [[Data Munging]] task, follows:
|
||||
<pre style="height:17ex;overflow:scroll">
|
||||
1991-03-30 10.000 1 10.000 1 10.000 1 10.000 1 10.000 1 10.000 1 10.000 1 10.000 1 10.000 1 10.000 1 10.000 1 10.000 1 10.000 1 10.000 1 10.000 1 10.000 1 10.000 1 10.000 1 10.000 1 10.000 1 10.000 1 10.000 1 10.000 1 10.000 1
|
||||
1991-03-31 10.000 1 10.000 1 10.000 1 10.000 1 10.000 1 10.000 1 10.000 1 20.000 1 20.000 1 20.000 1 35.000 1 50.000 1 60.000 1 40.000 1 30.000 1 30.000 1 30.000 1 25.000 1 20.000 1 20.000 1 20.000 1 20.000 1 20.000 1 35.000 1
|
||||
|
|
@ -17,6 +15,6 @@ A sample from the full data file [http://rosettacode.org/resources/readings.zip
|
|||
</pre>
|
||||
|
||||
The task:
|
||||
# Confirm the general field format of the file
|
||||
# Confirm the general field format of the file.
|
||||
# Identify any DATESTAMPs that are duplicated.
|
||||
# What number of records have good readings for all instruments.
|
||||
# Report the number of records that have good readings for all instruments.
|
||||
|
|
|
|||
115
Task/Text-processing-2/Eiffel/text-processing-2.e
Normal file
115
Task/Text-processing-2/Eiffel/text-processing-2.e
Normal file
|
|
@ -0,0 +1,115 @@
|
|||
class
|
||||
APPLICATION
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature
|
||||
|
||||
make
|
||||
-- Finds double date stamps and wrong formats.
|
||||
local
|
||||
found: INTEGER
|
||||
double: STRING
|
||||
do
|
||||
read_wordlist
|
||||
fill_hash_table
|
||||
across
|
||||
hash as h
|
||||
loop
|
||||
if h.key.has_substring ("_double") then
|
||||
io.put_string ("Double date stamp: %N")
|
||||
double := h.key
|
||||
double.remove_tail (7)
|
||||
io.put_string (double)
|
||||
io.new_line
|
||||
end
|
||||
if h.item.count /= 24 then
|
||||
io.put_string (h.key.out + " has the wrong format. %N")
|
||||
found := found + 1
|
||||
end
|
||||
end
|
||||
io.put_string (found.out + " records have not 24 readings.%N")
|
||||
good_records
|
||||
end
|
||||
|
||||
good_records
|
||||
-- Number of records that have flag values > 0 for all readings.
|
||||
local
|
||||
count, total: INTEGER
|
||||
end_date: STRING
|
||||
do
|
||||
create end_date.make_empty
|
||||
across
|
||||
hash as h
|
||||
loop
|
||||
count := 0
|
||||
across
|
||||
h.item as d
|
||||
loop
|
||||
if d.item.flag > 0 then
|
||||
count := count + 1
|
||||
end
|
||||
end
|
||||
if count = 24 then
|
||||
total := total + 1
|
||||
end
|
||||
end
|
||||
io.put_string ("%NGood records: " + total.out + ". %N")
|
||||
end
|
||||
|
||||
original_list: STRING = "readings.txt"
|
||||
|
||||
read_wordlist
|
||||
--Preprocesses data in 'data'.
|
||||
local
|
||||
l_file: PLAIN_TEXT_FILE
|
||||
do
|
||||
create l_file.make_open_read_write (original_list)
|
||||
l_file.read_stream (l_file.count)
|
||||
data := l_file.last_string.split ('%N')
|
||||
l_file.close
|
||||
end
|
||||
|
||||
data: LIST [STRING]
|
||||
|
||||
fill_hash_table
|
||||
--Fills 'hash' using the date as key.
|
||||
local
|
||||
by_dates: LIST [STRING]
|
||||
date: STRING
|
||||
data_tup: TUPLE [val: REAL; flag: INTEGER]
|
||||
data_arr: ARRAY [TUPLE [val: REAL; flag: INTEGER]]
|
||||
i: INTEGER
|
||||
do
|
||||
create hash.make (data.count)
|
||||
across
|
||||
data as d
|
||||
loop
|
||||
if not d.item.is_empty then
|
||||
by_dates := d.item.split ('%T')
|
||||
date := by_dates [1]
|
||||
by_dates.prune (date)
|
||||
create data_tup
|
||||
create data_arr.make_empty
|
||||
from
|
||||
i := 1
|
||||
until
|
||||
i > by_dates.count - 1
|
||||
loop
|
||||
data_tup := [by_dates [i].to_real, by_dates [i + 1].to_integer]
|
||||
data_arr.force (data_tup, data_arr.count + 1)
|
||||
i := i + 2
|
||||
end
|
||||
hash.put (data_arr, date)
|
||||
if not hash.inserted then
|
||||
date.append ("_double")
|
||||
hash.put (data_arr, date)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
hash: HASH_TABLE [ARRAY [TUPLE [val: REAL; flag: INTEGER]], STRING]
|
||||
|
||||
end
|
||||
62
Task/Text-processing-2/Fortran/text-processing-2.f
Normal file
62
Task/Text-processing-2/Fortran/text-processing-2.f
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
Crunches a set of hourly data. Starts with a date, then 24 pairs of value,indicator for that day, on one line.
|
||||
INTEGER Y,M,D !Year, month, and day.
|
||||
INTEGER GOOD(24,2) !The indicators.
|
||||
REAL*8 V(24,2) !The grist.
|
||||
CHARACTER*10 DATE(2) !Along with the starting date.
|
||||
INTEGER IT,TI !A flipper and its antiflipper.
|
||||
INTEGER NV !Number of entirely good records.
|
||||
INTEGER I,NREC,HIC !Some counters.
|
||||
LOGICAL INGOOD !State flipper for the runs of data.
|
||||
INTEGER IN,MSG !I/O mnemonics.
|
||||
CHARACTER*666 ACARD !Scratchpad, of sufficient length for all expectation.
|
||||
IN = 10 !Unit number for the input file.
|
||||
MSG = 6 !Output.
|
||||
OPEN (IN,FILE="Readings1.txt", FORM="FORMATTED", !This should be a function.
|
||||
1 STATUS ="OLD",ACTION="READ") !Returning success, or failure.
|
||||
NV = 0 !No pure records seen.
|
||||
NREC = 0 !No records read.
|
||||
HIC = 0 !Provoking no complaints.
|
||||
DATE = "snargle" !No date should look like this!
|
||||
IT = 2 !Syncopation for the 1-2 flip flop.
|
||||
Chew into the file.
|
||||
10 READ (IN,11,END=100,ERR=666) L,ACARD(1:MIN(L,LEN(ACARD))) !With some protection.
|
||||
NREC = NREC + 1 !So, a record has been read.
|
||||
11 FORMAT (Q,A) !Obviously, Q ascertains the length of the record being read.
|
||||
READ (ACARD,12,END=600,ERR=601) Y,M,D !The date part is trouble, as always.
|
||||
12 FORMAT (I4,2(1X,I2)) !Because there are no delimiters between the parts.
|
||||
TI = IT !Thus finger the previous value.
|
||||
IT = 3 - IT !Flip between 1 and 2.
|
||||
DATE(IT) = ACARD(1:10) !Save the date field.
|
||||
READ (ACARD(11:L),*,END=600,ERR=601) (V(I,IT),GOOD(I,IT),I = 1,24) !But after the date, delimiters abound.
|
||||
Comparisons. Should really convert the date to a daynumber, check it by reversion, and then check for + 1 day only.
|
||||
20 IF (DATE(IT).EQ.DATE(TI)) THEN !Same date?
|
||||
IF (ALL(V(:,IT) .EQ.V(:,TI)) .AND. !Yes. What about the data?
|
||||
1 ALL(GOOD(:,IT).EQ.GOOD(:,TI))) THEN !This disregards details of the spacing of the data.
|
||||
WRITE (MSG,21) NREC,DATE(IT),"same." !Also trailing zeroes, spurious + signs, blah blah.
|
||||
21 FORMAT ("Record",I8," Duplicate date field (",A,"), data ",A) !Say it.
|
||||
ELSE !But if they're not all equal,
|
||||
WRITE (MSG,21) NREC,DATE(IT),"different!" !They're different!
|
||||
END IF !So much for comparing the data.
|
||||
END IF !So much for just comparing the date's text.
|
||||
IF (ALL(GOOD(:,IT).GT.0)) NV = NV + 1 !A fully healthy record, either way?
|
||||
GO TO 10 !More! More! I want more!!
|
||||
|
||||
Complaints. Should really distinguish between trouble in the date part and in the data part.
|
||||
600 WRITE (MSG,*) '"END" declared - insufficient data?' !Not enough numbers, presumably.
|
||||
GO TO 602 !Reveal the record.
|
||||
601 WRITE (MSG,*) '"ERR" declared - improper number format?' !Ah, but which number?
|
||||
602 WRITE (MSG,603) NREC,L,ACARD(1:L) !Anyway, reveal the uninterpreted record.
|
||||
603 FORMAT("Record",I8,", length ",I0," reads ",A) !Just so.
|
||||
HIC = HIC + 1 !This may grow into a habit.
|
||||
IF (HIC.LE.12) GO TO 10 !But if not yet, try the next record.
|
||||
STOP "Enough distaste." !Or, give up.
|
||||
666 WRITE (MSG,101) NREC,"format error!" !For A-style data? Should never happen!
|
||||
GO TO 900 !But if it does, give up!
|
||||
|
||||
Closedown.
|
||||
100 WRITE (MSG,101) NREC,"then end-of-file" !Discovered on the next attempt.
|
||||
101 FORMAT ("Record",I8,": ",A) !A record number plus a remark.
|
||||
WRITE (MSG,102) NV !The overall results.
|
||||
102 FORMAT (" with",I8," having all values good.") !This should do.
|
||||
900 CLOSE(IN) !Done.
|
||||
END !Spaghetti rules.
|
||||
|
|
@ -1,43 +1,43 @@
|
|||
/*REXX program to process instrument data from a data file. */
|
||||
numeric digits 20 /*allow for bigger numbers. */
|
||||
ifid='READINGS.TXT' /*the input file. */
|
||||
ofid='READINGS.OUT' /*the outut file. */
|
||||
grandSum=0 /*grand sum of whole file. */
|
||||
grandflg=0 /*grand num of flagged data. */
|
||||
/*REXX program to process instrument data from a data file. */
|
||||
numeric digits 20 /*allow for bigger numbers. */
|
||||
ifid='READINGS.TXT' /*name of the input file. */
|
||||
ofid='READINGS.OUT' /* " " " output " */
|
||||
grandSum=0 /*grand sum of the whole file. */
|
||||
grandFlg=0 /*grand number of flagged data. */
|
||||
grandOKs=0
|
||||
longFlag=0 /*longest period of flagged data.*/
|
||||
contFlag=0 /*longest continous flagged data.*/
|
||||
oldDate =0 /*placeholder of penutilmate date*/
|
||||
w =16 /*width of fields when displayed.*/
|
||||
dupDates=0 /*count of duplicated timestamps.*/
|
||||
badflags=0 /*count of bad flags (¬ integer).*/
|
||||
badDates=0 /*count of bad dates (bad format)*/
|
||||
badData =0 /*count of bad datas (¬ numeric).*/
|
||||
ignoredR=0 /*count of ignored records (bad).*/
|
||||
maxInstruments=24 /*maximum number of instruments. */
|
||||
yyyyCurr=right(date(),4) /*get the current year (today). */
|
||||
monDD. =31 /*number of days in every month. */
|
||||
/*February is figured on the fly.*/
|
||||
Lflag=0 /*longest period of flagged data. */
|
||||
Cflag=0 /*longest continuous flagged data. */
|
||||
oldDate =0 /*placeholder of penultimate date. */
|
||||
w =16 /*width of fields when displayed. */
|
||||
dupDates=0 /*count of duplicated timestamps. */
|
||||
badFlags=0 /*count of bad flags (not integer). */
|
||||
badDates=0 /*count of bad dates (bad format). */
|
||||
badData =0 /*count of bad data (not numeric). */
|
||||
ignoredR=0 /*count of ignored records, bad records*/
|
||||
maxInstruments=24 /*maximum number of instruments. */
|
||||
yyyyCurr=right(date(),4) /*get the current year (today). */
|
||||
monDD. =31 /*number of days in every month. */
|
||||
/*# days in Feb. is figured on the fly.*/
|
||||
monDD.4 =30
|
||||
monDD.6 =30
|
||||
monDD.9 =30
|
||||
monDD.11=30
|
||||
|
||||
do records=1 while lines(ifid)\==0 /*read until finished. */
|
||||
rec=linein(ifid) /*read the next record (line). */
|
||||
parse var rec datestamp Idata /*pick off the dateStamp & data. */
|
||||
if datestamp==oldDate then do /*found a duplicate timestamp. */
|
||||
dupDates=dupDates+1 /*bump the counter.*/
|
||||
call sy datestamp copies('~',30),
|
||||
'is a duplicate of the',
|
||||
"previous datestamp."
|
||||
ignoredR=ignoredR+1 /*bump ignoredRecs.*/
|
||||
iterate /*ignore this duplicate record. */
|
||||
end
|
||||
do records=1 while lines(ifid)\==0 /*read until finished. */
|
||||
rec=linein(ifid) /*read the next record (line). */
|
||||
parse var rec datestamp Idata /*pick off the the dateStamp and data. */
|
||||
if datestamp==oldDate then do /*found a duplicate timestamp. */
|
||||
dupDates=dupDates+1 /*bump the dupDate counter*/
|
||||
call sy datestamp copies('~',30),
|
||||
'is a duplicate of the',
|
||||
"previous datestamp."
|
||||
ignoredR=ignoredR+1 /*bump # of ignoredRecs.*/
|
||||
iterate /*ignore this duplicate record. */
|
||||
end
|
||||
|
||||
parse var datestamp yyyy '-' mm '-' dd /*obtain YYYY, MM, and DD. */
|
||||
monDD.2=28+leapyear(yyyy) /*how long is February in YYYY ? */
|
||||
/*check for various bad formats. */
|
||||
parse var datestamp yyyy '-' mm '-' dd /*obtain YYYY, MM, and the DD. */
|
||||
monDD.2=28+leapyear(yyyy) /*how long is February in year YYYY ? */
|
||||
/*check for various bad formats. */
|
||||
if verify(yyyy||mm||dd,1234567890)\==0 |,
|
||||
length(datestamp)\==10 |,
|
||||
length(yyyy)\==4 |,
|
||||
|
|
@ -45,104 +45,96 @@ monDD.11=30
|
|||
length(dd )\==2 |,
|
||||
yyyy<1970 |,
|
||||
yyyy>yyyyCurr |,
|
||||
mm=0 | dd=0 |,
|
||||
mm>12 | dd>monDD.mm then do
|
||||
mm=0 | dd=0 |,
|
||||
mm>12 | dd>monDD.mm then do
|
||||
badDates=badDates+1
|
||||
call sy datestamp copies('~'),
|
||||
'has an illegal format.'
|
||||
ignoredR=ignoredR+1 /*bump ignoredRecs.*/
|
||||
iterate /*ignore this bad date record. */
|
||||
ignoredR=ignoredR+1 /*bump number ignoredRecs.*/
|
||||
iterate /*ignore this bad record. */
|
||||
end
|
||||
oldDate=datestamp /*save datestamp for next read. */
|
||||
oldDate=datestamp /*save datestamp for the next read. */
|
||||
sum=0
|
||||
flg=0
|
||||
OKs=0
|
||||
|
||||
do j=1 until Idata='' /*process the instrument data. */
|
||||
do j=1 until Idata='' /*process the instrument data. */
|
||||
parse var Idata data.j flag.j Idata
|
||||
|
||||
if pos('.',flag.j)\==0 |, /*flag have a decimal point -or-*/
|
||||
\datatype(flag.j,'W') then do /*is the flag not a whole number?*/
|
||||
badflags=badflags+1 /*bump counter.*/
|
||||
call sy datestamp copies('~'),
|
||||
'instrument' j "has a bad flag:",
|
||||
flag.j
|
||||
iterate /*ignore it & it's data.*/
|
||||
end
|
||||
if pos('.',flag.j)\==0 |, /*does flag have a decimal point -or- */
|
||||
\datatype(flag.j,'W') then do /* ··· is the flag not a whole number? */
|
||||
badFlags=badFlags+1 /*bump badFlags counter*/
|
||||
call sy datestamp copies('~'),
|
||||
'instrument' j "has a bad flag:",
|
||||
flag.j
|
||||
iterate /*ignore it and it's data. */
|
||||
end
|
||||
|
||||
if \datatype(data.j,'N') then do /*is the flag not a whole number?*/
|
||||
badData=badData+1 /*bump counter.*/
|
||||
call sy datestamp copies('~'),
|
||||
'instrument' j "has bad data:",
|
||||
data.j
|
||||
iterate /*ignore it & it's flag.*/
|
||||
end
|
||||
if \datatype(data.j,'N') then do /*is the flag not a whole number?*/
|
||||
badData=badData+1 /*bump counter.*/
|
||||
call sy datestamp copies('~'),
|
||||
'instrument' j "has bad data:",
|
||||
data.j
|
||||
iterate /*ignore it & it's flag.*/
|
||||
end
|
||||
|
||||
if flag.j>0 then do /*if good data, ... */
|
||||
OKs=OKs+1
|
||||
sum=sum+data.j
|
||||
if contFlag>longFlag then do
|
||||
longdate=datestamp
|
||||
longFlag=contFlag
|
||||
end
|
||||
contFlag=0
|
||||
end
|
||||
else do /*flagged data ... */
|
||||
flg=flg+1
|
||||
contFlag=contFlag+1
|
||||
end
|
||||
if flag.j>0 then do /*if good data, ~~~ */
|
||||
OKs=OKs+1
|
||||
sum=sum+data.j
|
||||
if Cflag>Lflag then do
|
||||
Ldate=datestamp
|
||||
Lflag=Cflag
|
||||
end
|
||||
Cflag=0
|
||||
end
|
||||
else do /*flagged data ~~~ */
|
||||
flg=flg+1
|
||||
Cflag=Cflag+1
|
||||
end
|
||||
end /*j*/
|
||||
|
||||
if j>maxInstruments then do
|
||||
badData=badData+1 /*bump counter.*/
|
||||
badData=badData+1 /*bump the badData counter.*/
|
||||
call sy datestamp copies('~'),
|
||||
'too many instrument datum'
|
||||
end
|
||||
|
||||
if OKs\==0 then avg=format(sum/OKs,,3)
|
||||
else avg='[n/a]'
|
||||
if OKs\==0 then avg=format(sum/OKs,,3)
|
||||
else avg='[n/a]'
|
||||
grandOKs=grandOKs+OKs
|
||||
_=right(comma(avg),w)
|
||||
_=right(commas(avg),w)
|
||||
grandSum=grandSum+sum
|
||||
grandFlg=grandFlg+flg
|
||||
if flg==0 then call sy datestamp ' average='_
|
||||
else call sy datestamp ' average='_ ' flagged='right(flg,2)
|
||||
end /*records*/
|
||||
|
||||
records=records-1 /*adjust for reading end-of-file.*/
|
||||
if grandOKs\==0 then grandAvg=format(grandsum/grandOKs,,3)
|
||||
else grandAvg='[n/a]'
|
||||
records=records-1 /*adjust for reading the end─of─file. */
|
||||
if grandOKs\==0 then grandAvg=format(grandsum/grandOKs,,3)
|
||||
else grandAvg='[n/a]'
|
||||
call sy
|
||||
call sy copies('=',60)
|
||||
call sy ' records read:' right(comma(records ),w)
|
||||
call sy ' records ignored:' right(comma(ignoredR),w)
|
||||
call sy ' grand sum:' right(comma(grandSum),w+4)
|
||||
call sy ' grand average:' right(comma(grandAvg),w+4)
|
||||
call sy ' grand OK data:' right(comma(grandOKs),w)
|
||||
call sy ' grand flagged:' right(comma(grandFlg),w)
|
||||
call sy ' duplicate dates:' right(comma(dupDates),w)
|
||||
call sy ' bad dates:' right(comma(badDates),w)
|
||||
call sy ' bad data:' right(comma(badData ),w)
|
||||
call sy ' bad flags:' right(comma(badflags),w)
|
||||
if longFlag\==0 then
|
||||
call sy ' longest flagged:' right(comma(longFlag),w) " ending at " longdate
|
||||
call sy ' records read:' right(commas(records ),w)
|
||||
call sy ' records ignored:' right(commas(ignoredR),w)
|
||||
call sy ' grand sum:' right(commas(grandSum),w+4)
|
||||
call sy ' grand average:' right(commas(grandAvg),w+4)
|
||||
call sy ' grand OK data:' right(commas(grandOKs),w)
|
||||
call sy ' grand flagged:' right(commas(grandFlg),w)
|
||||
call sy ' duplicate dates:' right(commas(dupDates),w)
|
||||
call sy ' bad dates:' right(commas(badDates),w)
|
||||
call sy ' bad data:' right(commas(badData ),w)
|
||||
call sy ' bad flags:' right(commas(badFlags),w)
|
||||
if Lflag\==0 then call sy ' longest flagged:' right(commas(LFlag),w) " ending at " Ldate
|
||||
call sy copies('=',60)
|
||||
call sy
|
||||
exit /*stick a fork in it, we're done.*/
|
||||
/*──────────────────────────────────LEAPYEAR subroutine─────────────────*/
|
||||
leapyear: procedure; arg y /*year could be: Y, YY, YYY, YYYY*/
|
||||
if length(y)==2 then y=left(right(date(),4),2)y /*adjust for YY year.*/
|
||||
if y//4\==0 then return 0 /* not ≈ by 4? Not a leapyear.*/
|
||||
return y//100\==0 | y//400==0 /*apply 100 and 400 year rule. */
|
||||
/*──────────────────────────────────SY subroutine───────────────────────*/
|
||||
sy: procedure; parse arg stuff; say stuff
|
||||
if 1==0 then call lineout ofid,stuff
|
||||
return
|
||||
/*──────────────────────────────────COMMA subroutine────────────────────*/
|
||||
comma: procedure; parse arg _,c,p,t;arg ,cu;c=word(c ",",1)
|
||||
if cu=='BLANK' then c=' ';o=word(p 3,1);p=abs(o);t=word(t 999999999,1)
|
||||
if \datatype(p,'W')|\datatype(t,'W')|p==0|arg()>4 then return _;n=_'.9'
|
||||
#=123456789;k=0;if o<0 then do;b=verify(_,' ');if b==0 then return _
|
||||
e=length(_)-verify(reverse(_),' ')+1;end;else do;b=verify(n,#,"M")
|
||||
e=verify(n,#'0',,verify(n,#"0.",'M'))-p-1;end
|
||||
do j=e to b by -p while k<t;_=insert(c,_,j);k=k+1;end;return _
|
||||
exit /*stick a fork in it, we're all done.*/
|
||||
/*────────────────────────────────────────────────────────────────────────────*/
|
||||
commas: procedure; parse arg _; n=_'.9'; #=123456789; b=verify(n,#,"M")
|
||||
e=verify(n,#'0',,verify(n,#"0.",'M'))-4
|
||||
do j=e to b by -3; _=insert(',',_,j); end /*j*/; return _
|
||||
/*────────────────────────────────────────────────────────────────────────────*/
|
||||
leapyear: procedure; arg y /*year could be: Y, YY, YYY, or YYYY*/
|
||||
if length(y)==2 then y=left(right(date(),4),2)y /*adjust for YY year.*/
|
||||
if y//4\==0 then return 0 /* not divisible by 4? Not a leapyear*/
|
||||
return y//100\==0 | y//400==0 /*apply the 100 and the 400 year rule.*/
|
||||
/*────────────────────────────────────────────────────────────────────────────*/
|
||||
sy: say arg(1); call lineout ofid,arg(1); return
|
||||
|
|
|
|||
54
Task/Text-processing-2/VBScript/text-processing-2.vb
Normal file
54
Task/Text-processing-2/VBScript/text-processing-2.vb
Normal file
|
|
@ -0,0 +1,54 @@
|
|||
Set objFSO = CreateObject("Scripting.FileSystemObject")
|
||||
Set objFile = objFSO.OpenTextFile(objFSO.GetParentFolderName(WScript.ScriptFullName) &_
|
||||
"\readings.txt",1)
|
||||
Set objDateStamp = CreateObject("Scripting.Dictionary")
|
||||
|
||||
Total_Records = 0
|
||||
Valid_Records = 0
|
||||
Duplicate_TimeStamps = ""
|
||||
|
||||
Do Until objFile.AtEndOfStream
|
||||
line = objFile.ReadLine
|
||||
If line <> "" Then
|
||||
token = Split(line,vbTab)
|
||||
If objDateStamp.Exists(token(0)) = False Then
|
||||
objDateStamp.Add token(0),""
|
||||
Total_Records = Total_Records + 1
|
||||
If IsValid(token) Then
|
||||
Valid_Records = Valid_Records + 1
|
||||
End If
|
||||
Else
|
||||
Duplicate_TimeStamps = Duplicate_TimeStamps & token(0) & vbCrLf
|
||||
Total_Records = Total_Records + 1
|
||||
End If
|
||||
End If
|
||||
Loop
|
||||
|
||||
Function IsValid(arr)
|
||||
IsValid = True
|
||||
Bad_Readings = 0
|
||||
n = 1
|
||||
Do While n <= UBound(arr)
|
||||
If n + 1 <= UBound(arr) Then
|
||||
If CInt(arr(n+1)) < 1 Then
|
||||
Bad_Readings = Bad_Readings + 1
|
||||
End If
|
||||
End If
|
||||
n = n + 2
|
||||
Loop
|
||||
If Bad_Readings > 0 Then
|
||||
IsValid = False
|
||||
End If
|
||||
End Function
|
||||
|
||||
WScript.StdOut.Write "Total Number of Records = " & Total_Records
|
||||
WScript.StdOut.WriteLine
|
||||
WScript.StdOut.Write "Total Valid Records = " & Valid_Records
|
||||
WScript.StdOut.WriteLine
|
||||
WScript.StdOut.Write "Duplicate Timestamps:"
|
||||
WScript.StdOut.WriteLine
|
||||
WScript.StdOut.Write Duplicate_TimeStamps
|
||||
WScript.StdOut.WriteLine
|
||||
|
||||
objFile.Close
|
||||
Set objFSO = Nothing
|
||||
Loading…
Add table
Add a link
Reference in a new issue