2025-09-25(木) パッケージ改訂
 1.使い方
 旧)d <- getwd()
  dummy <- CFD( d ) # ファイルが作成されます。PDFのあるディレクトリーに、
 新)dummy <- CFD() # getwd()がデフォルト
 2.区分ごとのサマリ・ファイルを出力
2022-09-07 使い方の改善。setwd()、getwd()
2020-02-12 v0.3.3 SBI証券、仕様変更(x6:証拠金の残高が削除されたための対応)
2020-12-28 v0.3.2 バグ修正(ページ下部の明細抽出もれ、x座標のソート)
2020-10-14 .txt → .csv
2020-10-12 Rパッケージ化
#
はじめに
世界の株価指数に投資することが出来る金融商品として、
くりっく株365があります。
上場CFD(東京金融取引所に上場する株価指数証拠金取引)ですが、
 個人だと申告分離課税、
 法人だと総合課税と、
確定申告をしなければなりません。
毎月の取引残高報告書に基づいて申告するのですが、
SBI証券の場合、PDFなのですよ。
これを手作業で集計するのが面倒なので、
PDF、取引残高報告書のうち(2頁〜)証拠金入出金明細書を
CSV(テキスト)にします。
これを会計ソフトと税務ソフト(eTaxの①預貯金)反映させることを目的としています。
#
注意点
テスト不足です。
・未使用と思われる列にデータがあると、誤動作するでしょう。
#
想定PDF
7列の表ですが、
摘要(3列)と備考(7列)にはデータが無いと想定しています。
使い方(パッケージ版)
githubにパッケージを作ったのでインストールしてください。
library( devtools ) # install.packages("devtools")
install_github("nt1969m/sbitools") #面倒な事を聞かれたら、3: Noneで、  
PDFのあるファイルパスを指定、実行
# setwd() ※PDFのあるディレクトリーを設定
    # R本体の場合、  「メニュー」 → 「その他」 → 「作業ディレクトリの変更」
    # RStudioの場合、「メニュー」→「Session」→「Set Working Directory」→「Choose Directory」
d <- getwd()
library(sbitools) 
dummy <- CFD( d ) # ファイルが作成されます。PDFのあるディレクトリーに、
CSVファイル(証拠金入出金明細書.csv)が作られたはず。
(コンティンジェンシー・プラン)
もしもの場合、
SBI証券がPDFの仕様を変更した(無意識も含めて)ことにより、
うまく動かない場合、
設定ファイルを作って下さい。
(PDFのあるディレクトリーを指定。dを設定の上で)
  d <- "./inst/extdata/"  # (例)PDFのあるディレクトリー
  spec <- data.frame( matrix( NA ,0 ,4 ) )
  colnames( spec ) <- c("h1","h2","x1","x4")
  spec[1,1:2] <- c("証拠金入出金明細書","受渡日")
  spec[1,3:4] <- c(25,488) # <------ ここをいじってみる
  save( spec ,file=file.path( d,"specCFD.Rda" ) )
specCFD.Rdaというファイルが作成されると、
デフォルト設定ではなく、
特注設定で実行します。
いじる箇所は以下
3列"x1":受渡日の先頭ポジション
4列"x4":減少の最終ポジション(減少と増加の判定に使用)
#↓過去の出来事
#
使い方(ソース直書き版)
source(	"PDF_CFD_SBI.R"	) 
	# PDFのあるディレクトリーを指定
d <- file.path( ... ,"B_0988_SBI証券" ,"CFD" )
出入 <- CFD.main( d )
csvファイル(証拠金入出金明細書.txt)が作成される。
	# pdfデータをインポートするため
library( pdftools )	# install.packages("pdftools")
CFD.main <- function( d ) {
		print( d )
	CFD <- CFD.init()	# ファイル別
	files	<- dir( d ,pattern=".pdf$" ,ignore.case=T )
	for( f in files) {
		p <- pdf_info( file.path( d ,f ) )$pages
		df <-	pdf_data( file.path( d ,f ) )
			print( c( f , p ) )
		CFD <- rbind( CFD ,CFD.pdf( df ,p ) )
	}
	csv <- CFD.fin( CFD )
	f <- file.path( d ,"証拠金入出金明細書.txt" )	
	write.csv( csv ,file=f )	
	print( f )
	
return( csv )
}
print( c( "CFD.main()" ,CFD.main ) )
CFD.pdf <- function( df ,p ) {
	CFD <- CFD.init()	# PDF別
	for( i in 1:p ) {  # i <- 2
		print( i )
		df_p <- sapply( df[[ i ]] ,"[" )  [ ,c("x","y","text") ]  
		x <- as.integer( df_p[ ,"x" ] )
		y <- as.integer( df_p[ ,"y" ] )
		h1 <- subset( df_p ,df_p[,"text"] == "証拠金入出金明細書" )
		h1_y <- as.integer( h1[,"y"] )
		if ( nrow( h1 ) == 0 ) next
		print( h1 )
		h2 <- subset( df_p ,df_p[,"text"] == "受渡日" )
		h2_y <- as.integer( h2[,"y"] )
		m <- df_p[ y > h2_y , ]
		r <- subset( m, m[ ,"x"] == 25 )
		CFD <- rbind(CFD ,CFD.line( m ,r ) )
	}
return( CFD )
}
print( c( "CFD.pdf()" ,CFD.pdf ) )
CFD.line <- function( m ,r ) {
	CFD <- CFD.init()	
	for( j in 1:nrow( r ) ) {  
		CFD[ j ,1 ] <- r[ j,"text"]	
		行 <- subset( m ,m[ ,"y" ]==r[ j , "y" ] )
		CFD[ j ,2 ] <- 行[ 2,"text"]	
		if( as.integer( 行[ 3,"x"] ) <= 488 ) {
			CFD[ j ,4 ] <- 行[ 3,"text"]
		} else {
			CFD[ j ,5 ] <- 行[ 3,"text"]
		}	
		CFD[ j ,6 ] <- 行[ 4,"text"]
			# 想定外かも?
		switch( ( nrow( 行 ) - 4 ) 
		,"1" = {
			print( 行 ) 
			}	
		)
	}
return( CFD )
}
print( c( "CFD.line()" ,CFD.line ) )
CFD.fin <- function( 出入 ) {
	出入[ ,1] <- gsub( "/" ,"-" ,出入[ ,1] )
	出入[ ,4] <- as.integer( gsub( "," ,"" ,出入[ ,4] ) )
	出入[ ,5] <- as.integer( gsub( "," ,"" ,出入[ ,5] ) )
	出入[ ,6] <- as.integer( gsub( "," ,"" ,出入[ ,6] ) )
	print( paste0("証拠金の増減=" ,sum( 出入[ ,5] ,na.rm=T ) - sum( 出入[ ,4] ,na.rm=T ) ) ) 
return( 出入 )
}
print( c( "CFD.fin()" ,CFD.fin ) )
CFD.init <- function( n=1 ) {
			# 列数
	df <- data.frame( matrix( NA ,0 ,7 ) )
			# 列名
	colnames( df ) <- c(
	 "受渡日="			# 列1
	,"区分="		# 列2
	,"摘要="			# 列3
	,"証拠金の減少="	 #,"証拠金の減少(円)="		# 列4
	,"証拠金の増加=" #,"証拠金の残高(円)="		# 列5
	,"証拠金の残高="	 #,"証拠金の残高(円)="		# 列6
	,"備考="		# 列7
	)
	switch( n
	, "1" =  {		# (2頁〜)証拠金入出金明細書
		#	print( sapply( df ,mode ) )
		}
	)
return( df )
}
print( c( "CFD.init()" ,CFD.init ) )
#
