[R] Write text file in Fortran format

Rui Barradas ru|pb@rr@d@@ @end|ng |rom @@po@pt
Thu Sep 22 13:27:36 CEST 2022


Hello,

Maybe the following solves the problem.
I hope it does if the mailman footer is no longer there.



# this path depends on the OP's system
path <- "~/Temp"
fl <- list.files(path, pattern = "Air.txt", full.names = TRUE)
# read the file as text
txt <- readLines(fl)

# find lines starting with an asterisk
i <- grep("^\\*", txt)
# keep the other lines
txt_table <- txt[-i]
txt_table <- trimws(txt_table)
df1 <- read.table(text = txt_table)
# multiply 3rd column by 2
df1[[3]] <- 2*df1[[3]]

# format the table's lines to write them back to file
fmt <- "%14.5f %13.5f %13.5f %8.2f %8.2f %8.2f %7s %8s %10s %9s %9d"
new_data <- sprintf(fmt,
                     df1[[1]], df1[[2]], df1[[3]], df1[[4]],
                     df1[[5]], df1[[6]], df1[[7]], df1[[8]],
                     df1[[9]], df1[[10]], df1[[11]])

# assemble the header and the table
txt_new <- c(txt[i], new_data)

# write to text file
fl2 <- file.path(dirname(fl), "Air2.txt")
writeLines(txt_new, fl2)


Hope this helps,

Rui Barradas

Às 11:35 de 22/09/2022, javad bayat escreveu:
> 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.
>>>>>>
>>>>>
>>>
>>
>



More information about the R-help mailing list