[R] Write text file in Fortran format

@vi@e@gross m@iii@g oii gm@ii@com @vi@e@gross m@iii@g oii gm@ii@com
Thu Sep 22 16:18:32 CEST 2022


Javad,

After reading the exchanges, I conclude you are asking a somewhat different question than some of us expected and I see some have zoomed in on what you seem to want.

You seem to want to make a very focused change and save the results to be as identical as what you started with. You also note you really have no idea about 
the process that created the file or uses it so it is hard to know if just changing parts results in a valid file.

So maybe this looks like not one file but three files. You seem to have a header region of N lines you want kept intact but also placed in the output untouched. You seem to have a few lines at the end you also seem to want to leave untouched. You have lots of lines in the middle you want treated as if it contains multiple columns of data in some format that looks like it is whitespace-separated, or maybe tabs.

And I think you want to do this transformation perhaps only once so a general purpose solution is not required.

So how about you get your favorite text editor or tool and extract the first N lines from the file and place it in a file called HEADER. You may also then delete it from a copy of the original file if you wish.

Similarly, extract the last lines you want to keep from the file and place it in a file called FOOTER.

What is left behind in a copy of the file should then be something people here might easily work with. You can use one of many methods as you wish to read the data into some kind of data.frame and supply names for the columns and whatever. You can make your changes to what seems like one column. You can save the output conceptually to use the same format as the input and place it in a file called NEW_DATA.

Note no actual files are necessarily needed but conceptually you now have some text in places called HEADER, NEW_DATA and FOOTER and you can combine them carefully (as in no blank lines or two lines concatenated without a newline) and get a new output file that should look like the input.

If your data format in the middle section uses something like a tab, this should work. If it uses whitespace and perhaps a fixed-width per line, you have an issue to deal with if your changes need more room than is available or need adjustment to calculate how many spaces to remove or add to center or line up the columns visible.

I will end by saying some others have offered variations that are probably just as reasonable. The problem is we may suggest you skip the first lines and it turns out you want to preserve them. Most R functions and packages I know about have no interest in preserving what effectively are often just comments but it seems easy enough to do. Your lines at the end are a bigger problem if you use standard commands to read in the data BECAUSE many such programs do a look-ahead at perhaps the first thousand lines to try to determine the number of columns and the type of each. Your extra lines at the end may perturb that and there may be weird results in your data at the end or even things like an integer column being considered to be character.



-----Original Message-----
From: R-help <r-help-bounces using r-project.org> On Behalf Of javad bayat
Sent: Thursday, September 22, 2022 6:35 AM
To: Rui Barradas <ruipbarradas using sapo.pt>
Cc: R-help using r-project.org
Subject: Re: [R] Write text file in Fortran format

These 2 lines were at the end of the text file, which I have attached but I had removed them to read the text file in R.
Just like the first 8 line that start with asterisk (*).






On Thu, 22 Sep 2022, 12:21 Rui Barradas, <ruipbarradas using sapo.pt> wrote:

> Hello,
>
> Are those lines at the begining of the file?
>
> Rui Barradas
>
> Às 06:44 de 22/09/2022, javad bayat escreveu:
> > Dear all; Many thanks for your useful comments and codes.
> > I tried both Rui's and Jim's codes.
> > Jim's codes gave an error as below:
> > "Error in substr(inputline, 1, begincol3 - 1) :
> >    object 'inputline' not found"
> > I don't know what's wrong.
> > The Rui's codes worked correctly for the attached file. But I have 
> > edited that file and removed 2 last lines from the file because I 
> > could not read it into R.
> > These 2 lines were:
> > "
> > ** CONCUNIT ug/m^3
> > ** DEPUNIT g/m^2
> > "
> > When I tried to run the code for my file that has these 2 lines at 
> > the
> end,
> > it gave me this error:
> > "
> >> df1 <- read.table(text = txt_table)
> > Error in read.table(text = txt_table) : no lines available in input 
> > "
> > The codes before the "df1 <- read.table(text = txt_table)" were run 
> > correctly.
> > Sincerely
> >
> >
> >
> > On Thu, Sep 22, 2022 at 6:58 AM javad bayat <j.bayat194 using gmail.com>
> wrote:
> >
> >> Dear all;
> >> I apologise, I didn't know that I have to cc the list.
> >> Thank you Mr Rui for reminding me.
> >> Let me clarify more.
> >> I have no knowledge of the FORTRAN language. The text file that has 
> >> been attached is a model's output file and I know that the format 
> >> is in
> FORTRAN.
> >> I want to write a text file exactly similar to the attached text 
> >> file
> using
> >> R programming.
> >> The steps below explain my goal:
> >> 1- Read the text file without the first 8 and last 2 rows as a
> dataframe.
> >> Maybe I have removed the last 2 lines, but at the end it had 2 
> >> lines similar the first 8 lines which starts with asterisk.
> >> 2- Double the 3rd column values (or multiply by specific number).
> >> 3- Insert the removed first 8 lines of the original text file as 
> >> header
> in
> >> the dataframe.
> >> 4- Insert the removed last 2 lines of the original text file at the 
> >> end
> of
> >> dataframe.
> >> 5- Write the dataframe as a new text file exactly similar to the
> original
> >> text file.
> >>
> >> I have used excel but when I save it as text file, the format 
> >> changes
> and
> >> is not similar to the attached text file.
> >> I will try all your codes in a few hours, cause I am out of office.
> >> Sincerely yours.
> >>
> >>
> >>
> >> On Thu, 22 Sep 2022, 04:20 Richard O'Keefe, <raoknz using gmail.com> wrote:
> >>
> >>> Oh, so you want to WRITE a file *like* that.
> >>> Use ?sprintf.
> >>> (3(1X,F13.5),3(1X,F8.2),3X,A5,2X,A8,2X,A5,5X,A8,2X,I8)
> >>>
> >>> Fortran sprintf
> >>> 1X      a space
> >>> 3X      3 spaces
> >>> F13.5   %13.5f
> >>> F8.2    %8.2f
> >>> A5      %5s
> >>> A8      %8s
> >>> I8      %8d
> >>> 3(...)  the translation of ... written 3 times
> >>>
> >>> We can simplify 1X,F13.5 to F14.5
> >>> Here's the sprintf() equivalent of the Fortran format, except 
> >>> you'll need to change the dots to spaces.
> >>>
> >>> "%14.5f%14.5f%14.5f%9.2f%9.2f%9.2f...%5s..%8s..%5s.....%8s%10d\n
> >>>
> >>> On Thu, 22 Sept 2022 at 04:17, javad bayat <j.bayat194 using gmail.com>
> wrote:
> >>>
> >>>> Dear Rasmus;
> >>>> I have no knowledge of the FORTRAN language. The text file that 
> >>>> has
> been
> >>>> attached is a model's output file and I know that the format is 
> >>>> in FORTRAN.
> >>>> I want to write a text file exactly similar to the attached text 
> >>>> file using R programming.
> >>>> The steps below explain my goal:
> >>>> 1- Read the text file without the first 8 and last 2 rows as a
> dataframe.
> >>>> 2- Double the 3rd column values (or multiply by specific number).
> >>>> 3- Insert the removed first 8 rows of the original text file as
> header in
> >>>> the dataframe.
> >>>> 4- Insert the removed last 2 rows of the original text file at 
> >>>> the
> end of
> >>>> dataframe.
> >>>> 5- Write the dataframe as a new text file exactly similar to the
> original
> >>>> text file.
> >>>>
> >>>> I have used excel but when I save it as text file, the format 
> >>>> changes
> and
> >>>> is not similar to the attached text file.
> >>>> Sincerely
> >>>>
> >>>> On Wed, 21 Sep 2022, 18:17 Rasmus Liland, <jral using posteo.no> wrote:
> >>>>
> >>>>> Dear Javad,
> >>>>>
> >>>>> Perhaps you were looking to read the table in Air.txt (is this 
> >>>>> Fortran
> >>>>> format?) into R?
> >>>>>
> >>>>>          b <- readLines("Air.txt")  # The text MIME attachment
> w/Mailman
> >>>>> footer ...
> >>>>>          b <- b[1:(which(b=="")-1)]  # Remove the odd Mailman 
> >>>>> footer
> (at
> >>>>> end of df)
> >>>>>          idx <- max(grep("^\\*", b))+1  # Start of df after 
> >>>>> header
> uline
> >>>>>          header <- tolower(strsplit(gsub("  +", "_", gsub("\\*", 
> >>>>> "", b[idx-2])), "_")[[1]])
> >>>>>          b <- read.table(text=b[-(1:idx)], header=F)
> >>>>>          colnames(b) <- header[header!=""]
> >>>>>          b <- b[,sapply(b, \(i) length(unique(i)))>1]  # Remove
> constant
> >>>>> cols
> >>>>>
> >>>>> str(b)
> >>>>>
> >>>>>          'data.frame':   31324 obs. of  6 variables:
> >>>>>           $ x           : num  583500 584000 584500 585000 585500 ...
> >>>>>           $ y           : num  3018700 3018700 3018700 3018700
> 3018700
> >>>> ...
> >>>>>           $ average conc: num  32.8 33.1 33.4 33.5 33.6 ...
> >>>>>           $ zelev       : num  0 0 0 0 0 0 0 0 0 0 ...
> >>>>>           $ zhill       : num  0 0 0 0 0 0 0 0 0 0 ...
> >>>>>           $ date(conc)  : int  16101706 16101706 16101706 
> >>>>> 16101706
> >>>> 16101706
> >>>>> ...
> >>>>>
> >>>>> Best,
> >>>>> Rasmus
> >>>>>
> >>>>> ______________________________________________
> >>>>> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, 
> >>>>> see https://stat.ethz.ch/mailman/listinfo/r-help
> >>>>> PLEASE do read the posting guide 
> >>>>> http://www.R-project.org/posting-guide.html
> >>>>> and provide commented, minimal, self-contained, reproducible code.
> >>>>>
> >>>>
> >>>>          [[alternative HTML version deleted]]
> >>>>
> >>>> ______________________________________________
> >>>> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see 
> >>>> https://stat.ethz.ch/mailman/listinfo/r-help
> >>>> PLEASE do read the posting guide
> >>>> http://www.R-project.org/posting-guide.html
> >>>> and provide commented, minimal, self-contained, reproducible code.
> >>>>
> >>>
> >
>

	[[alternative HTML version deleted]]

______________________________________________
R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.



More information about the R-help mailing list