- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
DateRep,Day,Month,Year,Cases,Deaths,Countries and territories,GeoId,Pop_Data.2018
25/03/2020,25,3,2020,2,0,Afghanistan,AF,37172386
21/03/2020,21,3,2020,2,0,Cape_Verde,CV,543767
10/03/2020,10,3,2020,-9,1,Cases_on_an_international_conveyance_Japan,JPG11668,
2/03/2020,2,3,2020,0,0,Cases_on_an_international_conveyance_Japan,JPG11668,
1/03/2020,1,3,2020,0,0,Cases_on_an_international_conveyance_Japan,JPG11668,
The death data file for the Corona Virus is in the above format. I had a small play with the data in C# but run into graphing problems, I am translating the program into Fortran - there appear to be some interesting features in the FFT of the data, which I hope to publish to help the health stat people.
Does anyone have a good idea for reading the line and then taking apart into
21/03/2020 -- ignore
21 integer to 0 on first line all integers the name is different character length, CV is usually only 2 chars and the population is an integer, but is pop missing from the JPG line and the id is not two characters.
There is a new file every day
Regards
John
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
As a CSV file, you could read the whole line as a text string and parse it to find each field and unpack into the appropriate variables.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
10/03/2020,10,3,2020,-9,1,Cases_on_an_international_conveyance_Japan,JPG11668,
You will have to deal with the Geold field not being 2 characters, and missing Pop_Data.2018
My guess is JPG11668 refers to a different file and/or record in file, and/or different region (island) of Japan. This data will have to be obtained elsewhere.
Edit: found this
https://kieranhealy.org/blog/archives/2020/03/21/covid-19-tracking/
Jim Dempsey
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
In the above mentioned link, they do not investigate (plot) infections/deaths per 100,000 per day.
The charts listed are of minimal value. you will need to get the population figures for Japan seperately.
Jim Dempsey
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
subroutine ReadFile()
implicit none
Logical Done
logical Exists
CHARACTER *2 af
CHARACTER *130 iline
EQUIVALENCE (af, iline)
integer flag
flag = 0
Done = .false.
call lineblankA()
DO WHILE (.NOT. done) ! Loop for all the data lines
READ (srB, '(A)', ERR=1000, END=400) iline ! Read line
write(*,*)'Here1'
write(*,*)af ! Write line to log file for checking
IF (af.EQ.'da' .OR. af.EQ.'DA') THEN
write(*,*)'Here'
Write(*,100)iline
100 format(A130)
ELSE
done = .TRUE.
endif
end do
return
1000 Stop ' Input Error in Country Data.'
400 continue
return
This does not work as expected -- the af does weird things -- help --
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Found error apologies -- need to actually call subroutine
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
In the file you uploaded, the header line reads:
DateRep,Day,Month,Year,Cases,Deaths,Countries and territories,GeoId,Pop_Data.2018
So af will never match "da" or "DA" as it has "Da" at beginning of line.
Jim Dempsey
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Jim:
Thanks -- if read the line in and use the equalivanece statement to match the first two characters on the first line. These people change the file a lot and I am trying to make it as robust as possible. That is a mecej4 trick, not mine.
I found a trick of looking for the markers using a series of if routines
it is working so far.
subroutine ReadFile(ModelA)
implicit none
TYPE (Model), TARGET :: ModelA
Logical Done
logical Exists
CHARACTER *2 af
CHARACTER *130 iline
EQUIVALENCE (af, iline)
integer flag
integer loc
integer yyyy,mm,dd, rd,md, yd
flag = 0
Done = .false.
call lineblankA()
DO WHILE (.NOT. done) ! Loop for all the data lines
READ (srB, '(A)', ERR=1000, END=400) iline ! Read line
flag = flag + 1
IF (af.EQ.'DA' .OR. af.EQ.'da') THEN ! If line tagged as node
write(*,100)iline
100 Format(A130)
elseif ((iline(3:3) .eq. '-')) then
read(iline(1:2),120)dd
120 format(i2)
if ((iline(6:6) .eq. '-')) then
read(iline(4:5),140)mm
140 format(i2)
if((iline(11:11) .eq. ',')) then
read(iline(7:11),150)yyyy
150 Format(i4)
if((iline(13:13) .eq. ',')) then
Write(*,*)'here b'
read(iline(12:12),160)rd
160 format(i1)
if((iline(15:15) .eq. ',')) then
Write(*,*)'here d'
read(iline(14:14),160)md
loc = 15
elseif((iline(16:16) .eq. ',')) then
Write(*,*)'here d'
read(iline(14:15),120)md
loc = 16
endif
elseif((iline(14:14) .eq. ',')) then
Write(*,*)'here c'
read(iline(12:13),140)rd
if((iline(16:16) .eq. ',')) then
Write(*,*)'here d'
read(iline(15:15),160)md
loc = 16
elseif((iline(17:17) .eq. ',')) then
Write(*,*)'here d'
read(iline(15:16),120)md
loc = 17
endif
endif
end if
endif
if((iline(loc+5:loc+5) .eq. ',')) then
read(iline(loc+1:loc+4),150)yd
endif
write(*,110)flag, dd, mm, yyyy, rd, md, loc,yd
110 Format('Line number :: ' i6,' Line details - Day :: ', i2, ' Month :: ', i2, ' Year :: ',i4, ' Day :: ',i2, ' Month :: ',i2,' Location :: ',i2,' Year :: ',i4)
ELSE
400 ModelA%LineCount = flag
done = .TRUE.
endif
end do
return
1000 Stop ' Input Error in Country Data.'
return
end subroutine ReadFile
I am almost there with the read then setting up the structure
I should have kept my mouth closed and not said - this looks interesting
John
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
It appears to be the manifest file, is it safe to turn it off
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
John,
Add arrays for:
DateRep, Day, Month, Year, Cases, Deaths, Countries_and_territories, GeoId, Pop_Data_2018
Read the file line by line (no equivalence)
Use the comma as a separator to extract each field and insert into each field into its respective array
note, some lines end in , leaving the last field blank.
This data file is not fixed field. don't assume the Geold is 2 characters. I saw that the data file may have an exception with a 3 character code.
RE: Microsoft Defender
Check the Document. See if there is an exclude folder option, I use Avast and it has this option.
Jim Dempsey
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Jim:
Thanks for the notes. It has been interesting, I have swapped computers, deleted Intel , VS and done a lot of reinstalling with different versions of VS and Fortran.
The error continues to occur in all combinations.
So I have been back through and added line by line and tested at eaxh step. There appears to be a problem with
if((iline(loc+5:loc+5) .eq. ',')) then
read(iline(loc+1:loc+4),210)name2
nameA = name2
210 format(A4)
elseif((iline(loc+6:loc+6) .eq. ',')) then
read(iline(loc+1:loc+5),220)name5
nameA = name5
220 format(A5)
elseif((iline(loc+7:loc+7) .eq. ',')) then
read(iline(loc+1:loc+6),*)name6
nameA = name6
230 format( A6)
end if
The read(iline(loc+1:loc+6),230)name6 causes the virus error on both VS which will not run the program if I change the * to 230 and from Defender.
I am not sure if it is a bug or a code error.
The CV.zip has the current iteration.
I have to check the output files once I am finished to catch all the oddities in the data file. US Virgin Islands causes a strange output. But I want to solve this problem first.
Thanks for the help
John
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
This is more what I had in mind:
! CVJD.f90
program CVJD
implicit none
character(len=256) :: inputLine
integer :: inputFileUnit, outputFileUnit
character(len=*), parameter :: inputFileName = "e.txt"
character(len=*), parameter :: outputFileName = "test.txt"
integer :: comma, priorComma, nCommas
character(len=50) :: hDateRep
character(len=50) :: hDay
character(len=50) :: hMonth
character(len=50) :: hYear
character(len=50) :: hCases
character(len=50) :: hDeaths
character(len=50) :: hCountries_and_territories
character(len=50) :: hGeoId
character(len=50) :: hPop_Data ! .2018
character(len=8), allocatable :: DateRep(:)
integer, allocatable :: Day(:)
integer, allocatable :: Month(:)
integer, allocatable :: Year(:)
integer, allocatable :: Cases(:)
integer, allocatable :: Deaths(:)
character(len=50), allocatable :: Countries_and_territories(:)
character(len=8), allocatable :: GeoId(:)
integer(8), allocatable :: Pop_Data(:) ! .2018
integer(8) :: inputFileSize
integer :: maxRecords, nRecords
open(newunit=outputFileUnit, file=outputFileName, access='sequential', action='write', err=888)
! write(outputFileUnit) "test"
! close(outputFileUnit)
open(newunit=inputFileUnit, file=inputFileName, access='sequential', action='read', err=999)
! read the header
read(inputFileUnit,"(A)") inputLine
comma = index(inputLine,",")
if(comma < 2) goto 777
hDateRep = inputLine(1:comma-1)
priorComma = comma
comma = index(inputLine(priorComma+1:),",")
if(comma == 0) goto 777
comma = priorComma + comma
hDay = inputLine(priorComma+1:comma-1)
priorComma = comma
comma = index(inputLine(priorComma+1:),",")
if(comma == 0) goto 777
comma = priorComma + comma
hMonth = inputLine(priorComma+1:comma-1)
priorComma = comma
comma = index(inputLine(priorComma+1:),",")
if(comma == 0) goto 777
comma = priorComma + comma
hYear = inputLine(priorComma+1:comma-1)
priorComma = comma
comma = index(inputLine(priorComma+1:),",")
if(comma == 0) goto 777
comma = priorComma + comma
hCases = inputLine(priorComma+1:comma-1)
priorComma = comma
comma = index(inputLine(priorComma+1:),",")
if(comma == 0) goto 777
comma = priorComma + comma
hDeaths = inputLine(priorComma+1:comma-1)
priorComma = comma
comma = index(inputLine(priorComma+1:),",")
if(comma == 0) goto 777
comma = priorComma + comma
hCountries_and_territories = inputLine(priorComma+1:comma-1)
priorComma = comma
comma = index(inputLine(priorComma+1:),",")
if(comma == 0) goto 777
comma = priorComma + comma
hGeoId = inputLine(priorComma+1:comma-1)
priorComma = comma
comma = index(inputLine(priorComma+1:),",")
if(comma > 0) goto 777
hPop_Data = inputLine(priorComma+1:) ! .2018
! estimate storage space
inquire(inputFileUnit, size=inputFileSize) ! get file size
! smallest record (line size) is ~40 characters
maxRecords = inputFileSize / 40
allocate(DateRep(maxRecords), Day(maxRecords), Month(maxRecords), Year(maxRecords), Cases(maxRecords))
allocate(Deaths(maxRecords), Countries_and_territories(maxRecords), GeoId(maxRecords), Pop_Data(maxRecords))
nRecords = 0
do
! read the header
read(inputFileUnit,"(A)",END=111) inputLine
nRecords = nRecords + 1
comma = index(inputLine,",")
if(comma < 2) goto 777
DateRep(nRecords) = inputLine(1:comma-1)
priorComma = comma
comma = index(inputLine(priorComma+1:),",")
if(comma == 0) goto 777
comma = priorComma + comma
read(inputLine(priorComma+1:comma-1),"(I)") Day(nRecords)
priorComma = comma
comma = index(inputLine(priorComma+1:),",")
if(comma == 0) goto 777
comma = priorComma + comma
read(inputLine(priorComma+1:comma-1),"(I)") Month(nRecords)
priorComma = comma
comma = index(inputLine(priorComma+1:),",")
if(comma == 0) goto 777
comma = priorComma + comma
read(inputLine(priorComma+1:comma-1),"(I)") Year(nRecords)
priorComma = comma
comma = index(inputLine(priorComma+1:),",")
if(comma == 0) goto 777
comma = priorComma + comma
read(inputLine(priorComma+1:comma-1),"(I)") Cases(nRecords)
priorComma = comma
comma = index(inputLine(priorComma+1:),",")
if(comma == 0) goto 777
comma = priorComma + comma
read(inputLine(priorComma+1:comma-1),"(I)") Deaths(nRecords)
priorComma = comma
comma = index(inputLine(priorComma+1:),",")
if(comma == 0) goto 777
comma = priorComma + comma
Countries_and_territories(nRecords) = inputLine(priorComma+1:comma-1)
priorComma = comma
comma = index(inputLine(priorComma+1:),",")
if(comma == 0) goto 777
comma = priorComma + comma
GeoId(nRecords) = inputLine(priorComma+1:comma-1)
priorComma = comma
comma = index(inputLine(priorComma+1:),",")
if(comma > 0) goto 777
if(inputLine(priorComma+1:priorComma+9) == " ") then
Pop_Data(nRecords) = 0
else
read(inputLine(priorComma+1:),"(I)") Pop_Data(nRecords)
endif
end do
111 print *,inputLine
print *,"**************** have data, do your thing ***********"
stop
777 print *,"Invalid header record"
stop
888 print *, "Error opening output file", outputFileName
stop
999 print *, "Error opening input file", inputFileName
stop
end program CVJD
Jim Dempsey
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
You can fancify that if you want: additional error checking, pick nth argument from line as text or integer (or real or double), etc...
Jim Dempsey
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Jim:
I knew there was a better way to do it -- thanks ---
You are great thanks
John
20 Format(i6,' ', A2, ' ', i4, 88(' ', i5))
How would you make the 88 a variable?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
7 days till a 1000 deaths per day and 17 days to 10000 per day and 27 days to 100000
I pray to all that is holy that I am wrong.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
It is accelerating and it has an underlying FFT - damn
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
The underlying FFT causes the 0.8 -- it is interesting - the line is fully about the line for the last 10 days
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Teh Europeans changed the file format again today -- got to love them.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
You displayed a plot in #16 and your subsequent comments refer to the same plot. Unfortunately, you did not tell us what the abscissa and ordinate variables were.
Does FFT mean 'food for thought' or 'fast Fourier transform'?
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page