PDF（SBI証券、割当株式等のお知らせ）からCSV（テキスト）を作成する

2022-09-07 「使い方」の改善。setwd()、getwd()
2020-10-18 Rパッケージ化
#<h1>はじめに</h1>
法人税の決算作業で「有価証券を整理する」

通常であれば、
　　証券会社のCSV（約定明細）から
　　「⑥有価証券の内訳書」を作成するだけです。
ですが、これだと
　　「⑥有価証券の内訳書」の株式数量が合わない、
ことがあります。

たぶん、株式分割です。
例えば、
　　(9432)NTTは2019-12-31に分割比率1:2で株式分割してるので、
　　保有株式数が400株だと800株に変更となります。
この事実を
割当株式として取り込む必要があるのです。

しかしこれが、
SBI証券の場合、
　　元ネタがPDFなのですよ。↓サンプル
![2020-09-30 20.49のイメージ.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374784/335f2bab-012b-d9a8-4023-92316e241fc0.jpeg)
#<h6>想定PDF</h6>
|位置|テキスト||
|:--|:--|:--|
|x→|　|横の位置|
|y↓|　|　|
|上段|||
|126| 銘柄、権利区分、権利割当日、分割比率|y1|
|135| (銘柄コード)|y2|
|下段|||
|180|加入者名、お預り数量、割当数量、合計数量　|y3|
|縦の位置||

#<h1>使い方（パッケージ版）</h1>
githubにパッケージを作ったのでインストールしてください。

```r:準備.r
library(devtools) # install.packages("devtools")
install_github("nt1969m/sbitools") #面倒な事を聞かれたら、3: Noneで、  
```
PDFのあるファイルパスを指定し、実行して下さい。

```r:CSV作成.R
# setwd() ※PDFのあるディレクトリーを設定
    # R本体の場合、  「メニュー」 → 「その他」 → 「作業ディレクトリの変更」
    # RStudioの場合、「メニュー」→「Session」→「Set Working Directory」→「Choose Directory」
d <- getwd()
library(sbitools)
dummy <- As(d) # Allocated sharesの略語のつもり
```
CSVファイル(割当株式等.csv)が作られたはず。

#<h1>使い方（ソース直書き版）   <br>※ご興味のある方のみ、ご参照ください<br></h1>
```r:割当csv.R
# 株式分割
source( "B_0988_SBI証券_割当株式.R" ) 
# PDF群のディレクトリー
d <- file.path(	FY  ,"B_0988_SBI証券/割当株式"	) 
  # FY:会計年度(Fiscal Year)のディレクトリ

  # ファイル単位であれば
  # f	<- file.path( d	,"YYYYmmddnnnnnnnnnnnn.PDF" )
# PDF→CSV変換
mei	<-	割当株式_d( d )	# ディレクトリー単位
  # mei	<-	割当株式( f ) # ファイル単位
# _全角csv出力
write.table( mei ,file.path( d ,"割当株式_全角.txt" ) )		 # ディレクトリー単位
  # write.table( mei ,gsub( ".PDF" ,"_全角.txt" ,f ) )		# ファイル単位

#  半角 ← 全角
h_mei <- 半角( mei )

# _半角csv出力
write.table( h_mei ,file.path( d ,"割当株式_半角.txt" ) )	# ディレクトリー単位
  # write.table( h_mei ,gsub( ".PDF" ,"_半角.txt" ,f ) )	# ファイル単位
```
```r:B_0988_SBI証券_割当株式.R
# pdfデータをインポートするため
 library( pdftools ) # install.packages( 'pdftools' )
# 全角→半角
 library( stringi ) # install.packages( "stringi")

# 最終型
割当株式.init	<- function()	{
	# 列数を初期化
	割当株式 <- data.frame( matrix( NA ,0 ,9 ) )
	# 列名を初期化
	colnames( 割当株式 )		<-	c(
 "銘柄"	,"銘柄コード"
,"権利区分"	 ,"権利割当日" ,"分割比率"
,"加入者名"	,"お預り数量"	 ,"割当数量" ,"合計数量" )
return( 割当株式 )		
}
# y抽出
yn <- function( df ,p ,n )	{
	# p:ページ
	# n:明細行の"y"
	x <- paste0( df[[ p ]]
				[ df[[ p ] ]$"y" == n	,	]$"x"	)
	x <- as.integer( x )
	o <- order( c( x ) )
	t <- paste0( df[[p] ]
				[ df[[p] ]$"y" == n	,	]$"text"	)
return( t[ o ] )
}
# 日付の対処
ymd <- function( ve ) {
	d	<-	grep(		"日"	,ve		)	
 	if( length( d ) != 1 )	return( ve )						# ベクトルの要素が「１」である事
	y	<-	grep(		"年"	,ve		)	
 	switch(	d	
 	,	"1"	= {
				 	if(	y == 1 ) {
				 		paste0( ve[ d ]	)							# 年月日 
				 	} else
				 		paste0( ve[ y ] ,ve[ d ]	)				# (月日) (年)	※欧米かよ
		}
 	,	"2"	= paste0( ve[1]	,ve[ d ]		)				# (年)月日 or (年月)日
 	,	"3"	= paste0( ve[1]	,ve[2]		,ve[ d ]		)	# (年)(月)(日)
	)
}
# 上段
upper	<- function( df ,p )	{
	# p : ページ p <- 1
	y1 <- yn( df ,p ,126 )
	y2 <- yn( df ,p ,135 )
	k <- grep( "株式分割" ,y1 )
	銘柄 <- y1[ 1:k-1 ]
	権利区分 <- y1[ k ]
	n <- grep( "[年月日]" ,y1 )
	y <- n[ n > k ]
	ve <- paste( y1[ y ] )
	権利割当日 <- ymd( ve )
	n <- grep( "：" ,y1 )
	分割比率 <- paste0( y1[n] ,y1[n+1] )
return( c( 銘柄 ,y2 ,権利区分 ,権利割当日 ,分割比率  ) )
}
# 下段
lower	<- function( df ,p )	{
	# p : ページ
	y3 <- yn( df ,p ,180 )
}

# 割当株式
割当株式 <- function( f ) {
	# pdf_info( f )
# 入力
	Pages	<- pdf_info( f )$pages	# 総ページ数
	df	<-	pdf_data( f )
# 出力
	mei	<- 割当株式.init()	
	for( p in 1:Pages ) {
	# ページ単位
		mei[ p , ] <-	c( upper( df ,p )　,lower(  df ,p ) )  
	}
return( mei )
}
# 半角
半角 <- function( mei ) {
	han	<- 割当株式.init()
	for( i in 1:nrow( mei ) ) {
		han[ i , ]	<-	stri_trans_nfkc( mei [ i , ] )
	}
	han[ ,"権利割当日"] <- as.Date( han[ ,"権利割当日" ] ,format="%Y年%m月%d日")
return( han )
}

割当株式_d <- function( d ) {
	files <- dir(	d ,pattern = ".pdf$" ,ignore.case=T )
	stack <- 割当株式.init()
	for( i in 1:length( files ) ) {
	f <- file.path( d ,files[ i ] )	# ファイル単位
	mei 	<- 割当株式( f )
	stack 	<- rbind( stack ,mei )
	}
return( stack )
}		
```