substr2 {lazy.tools}R Documentation

Substring Using Column Location as the Unit.

Description

Substring Using Column Location as the Unit.

Usage

substr2(x, from, to = 0, strict = 0, trim = 0, ...)

Arguments

x

A string vector

from

The first column (location in a line of a text file)

to

The last column or 0 meaning the end of string

strict

= 1 to check if start and stop are valid.

trim

= 1 to trim the result by lazy.tools::trim

...

options for lazy.tools::trim

Details

It is assumed that the double or triple byte character takes two colums of a text file. (Zenkaku Character)
See the description of cchar.

When scrict=1, if the start or stop value is invalid, NA will be returned.
When strict=0, if the start value is valid and the stop value is invalid, stop will be set to the location of the last character.

When trim is used, the result will be re-encoded to UTF-8.

Value

A vector consisting of the substrings of the input vector. The result will be a list if the input is a string vector.

Examples


# A string consisting of single and multi byte characters
# The 3rd, 6th and 7th characters are uppercase Zenkaku Romans.
{if( regexpr("utf8",Sys.getlocale (category = "LC_CTYPE")) > 0 )
 nza <- c(97, 98, 239, 188, 163, 100, 101, 239, 188, 166, 239, 188, 167, 104)
else
 nza <- c(97,98,130,98,100,101,130,101,130,102,104)}
za <- rawToChar(as.raw(nza))
# za <- num2char(nza)

printm(za)
# location of the multi byte characters
is.DBCS(za)
printm( nchar(za), nchar2(za), nchar(za)+sum(is.DBCS(za)) )
printm(unlist(strsplit(za,"")),nbyte(za),cchar(za))
# The first to the fourth characters
substr(za,1,4)
# The characters of za in the first to the fourth column.
substr2(za,1,4)


# Another example
{if( regexpr("utf8",Sys.getlocale (category = "LC_CTYPE")) > 0 )
 nn <- c(87, 101,  32, 104,  97, 118, 101,  32, 228, 184, 141, 232, 184
        , 176, 231, 159, 169,  32, 121, 101, 116,  33)
else
 nn <- c(87, 101,  32, 104,  97, 118, 101,  32, 149, 115, 230, 250, 139
         , 233, 32, 121, 101, 116,  33)}
za2=num2char(nn)
printm( nchar(za2), nchar2(za2), nchar(za2)+sum(is.DBCS(za2)) )
printm(1:nchar(za2),unlist(strsplit(za2,"")),nbyte(za2),cchar(za2))

# Note that start and stop must be the numbers contained in, resp,
# the first and the second columns of the returning matrix from
# cchar function.
substr2(za2,4,7)    # ok
substr2(za2,4,9)    # NG
substr2(za2,4,10)   # ok
substr2(za2,4,11)   # NG
substr2(za2,4,12)   # ok
substr2(za2,4,9, strict=1)    # NG
substr2(za2,4,11, strict=1)   # NG
substr2(za2,9,10, strict=1)   # ok
substr2(za2,9,11, strict=1)   # NG




# reading Shift-JIS files on from R.4.1.3
nobs <- 10
infile1 <- system.file("TestData1.txt",package="lazy.tools")
if( regexpr("utf8",Sys.getlocale (category = "LC_CTYPE")) > 0 ){
 temp1 <- ReadLines(infile1, n=nobs+2)[-(1:2)]
} else{
 # The result will be Double Byte.
 temp1 <- ReadLines(infile1, n=nobs+2, asDB=1)[-(1:2)]
 # The result will be Triple Byte.
 temp11 <- ReadLines(infile1, n=nobs+2)[-(1:2)]

 nbyte(temp1)
 nbyte(temp11)
 identical(temp1[-nobs],temp11[-nobs])  # true
 identical(nbyte(temp1[-nobs]),nbyte(temp11[-nobs])) # false
}

# reading UTF-8
nobs <- 10
infile2 <- system.file("TestData2.txt",package="lazy.tools")
temp2 <- ReadLines(infile2, n=nobs+2, encoding="UTF-8")[-(1:2)]
nbyte(temp2)

# starting and ending columns of each field
from=c(1, 7,25,26,27,28,29,30,31,32,34)
to=c(  5,23,25,26,27,28,29,30,31,32,39)

# character locations corresponding to from and to: should be equal.
FTc1=cchar( temp1, from, to )
FTc2=cchar( temp2, from, to )
char=strsplit(temp1[1],"")[[1]]
printm( char, from,to, FTc1[[1]],FTc2[[1]] )

# substringing using FTc
substring( temp2[1], FTc1[[1]][,1], FTc2[[1]][,2] )
substring( temp2[2], FTc1[[2]][,1], FTc2[[2]][,2] )

# get the field values as substrings  using substr2 function
s12=substr2(temp1,from[2],to[2])
s14=substr2(temp1,from[4],to[4])
s111=substr2(temp1,from[11],to[11])
s22=substr2(temp2,from[2],to[2])
s24=substr2(temp2,from[4],to[4])
s211=substr2(temp2,from[11],to[11])

# comparison
printm(s14,s24)

# Note that s111 and s211 are trimmed because they come from
# the variable length last columns.
# (On R4.1.3  s21 and s11 cannot be printmed together by printm.)
print.listof(list(s12=s12,s22=s22,s111=s111,s211=s211))

# On R4.1.3,
# substr or substr2 does not change the encoding.
# lazy.tools::trim changes the encoding.
# s12t=trim(s12)
# printm( s12[1], s12t[1] )
# printm( nbyte(s12[1]),nbyte(s12t[1]) )
# This does not.
# s12tt=substr(s12,1,nchar(trim(s12)))
# printm(s12[1],s12tt[1])
# printm(nbyte(s12[1]),nbyte(s12tt[1]))



[Package lazy.tools version 0.1.4 ]