IT」カテゴリーアーカイブ

python テキストファイルを読み込んで、CSVファイルを出力する

 

#テキストファイルを読み込んで、CSVファイルを出力する
#def outMojiMK(text):テキストファイルの1行をtextに入れて、空白をカンマに置換する
#カンマに置換してCSVとして出力する
#今の手順は、株探のページからオプションのデータをテキストファイルに保存
#そしてShift+Enterで実行
#なお、テキストファイルとCSVファイルは今の所指定である。上書き注意

anaconda、JupyterLabを使用。Shift+Enterで実行する

テキストファイル画像、スペースで配置されている。状態をカンマに置き換えたいテキストファイル

↓CSVにした。不足分はカンマを追加している

CSV

表計算アプリでCSVを表示した

Number

import re
import sys
import os

##
    #半角と全角の置換をする前に、出来高の次に前日比があるかをチェックする。
    #チェック方法
    #チェックは、出来高と価格の間に、前日比がないときは、空白の数が多いのでその数で、前日比が
    #入っていないことがわかる。
    #これから、2020/12/16
    #考え方1:先頭から数字1を探す。次に、その数字から次の半角を探して、また次の数字2を探す
    #数字1と数字2の間の空白が4以上空いていたら、前日比が存在しない。
    #find,re.search()を使う。ただしFindは正規表現が使えない。
def outMojiMK(text):
    #空白を削除する前に、空白の個数を数える
    #株探の仕様が変わったらここを変える。2020/12/16
    kuro=re.compile('[  ]+')#半角と全角の空白置換 半角全角が[半角全角]として入っている
    
    if text.count(' ',0,15)>=13:
           #空白13個はプット
            opt='put'
            textout=text.strip()#先頭、末尾の空白を削除する
    else:
            #コールの場合、2種類あるのでそれをチェックする
            textout=text.strip()#先頭、末尾の空白を削除する
            check=kuro.sub(',',textout)#半角全角の空白を置換
            count=check.split(",")
            #print ('len count:',len(count))
            if len(count)>=5:#配列が5個以上なら、call,putが含まれる       
                opt='callandput'
            else:
                opt='onlycall'
    pattern=re.compile('[0-9]+')#findで正規表現ができない
    if opt=='onlycall' or opt=='callandput':
        #次に、「call,putあり」OR「Callのみ」かをチェックする。
        #optSub='callandput' 'onlycall'
        #callのみを先に処理して、put側を調べる
        matchobj=re.search('[0-9]+',textout)#最初の数字を探す
        if matchobj:
            #print('マッチした文字列:'+matchobj.group())
            #print('マッチした文字列グループ:',matchobj.groups())
            #print( '開始位置'+str(matchobj.start()) )#先頭位置は0番として数える 3番目(4文字目)に見つかった
            #print( '終了位置'+str(matchobj.end()) )#終了位置は次の番目を含んでいるので実際は1を引いた数が終了位置
            #print(matchobj.span())#'マッチした文字列の (開始位置, 終了位置) のタプル'+
            #2番めの数字を探す
            secondMatch=pattern.search(textout,matchobj.end())#compileを使用してpatternで再度位置を指定して探す
            if secondMatch:
                #print( '開始位置2:'+str(secondMatch.start()) )#先頭から数えて10番目に次の数字が見つかった
                #1番目と2番めの文字数が5以上空いていたら数字が抜けている事がわかる。
                #ここに0を埋める処理を入れる
                if secondMatch.start()-matchobj.end() >=5:
                    print('コールで値が抜けてる')
                    # hash = "355879ACB6"
                    # hash = hash[:4] + '-' + hash[4:]
                    #文字列の挿入。#1番目の文字の3文字目くらいに0を追加する。
                    texttmp=textout[:matchobj.end()+2]+ '0' + textout[matchobj.end()+2:]
                    textout=texttmp
        #put側のチェック。再度optでチェックする
        if opt=='onlycall':
            #置換して終わる
            output=kuro.sub(',',textout)+',,,'
        elif opt=='callandput':
            print('callandputの処理')
            #後ろの文字のチェックをする
            i = 0
            checkArray=[]#タプルを入れる配列
            while i >= 0:#数字を探す
              m = pattern.search(textout, i)
              if m:
                #print(m.start())
                #print(m.end())
                #これをタプル配列に入れて、N,N-1で差が大きいときに0を入れる
                #print(m.span())
                checkArray.append(m.span())
                i = m.end()#m.start() + 1#m.end()
              else:
                break
            print("len checkArray",len(checkArray))
            #次はここから、2020/12/17
            n=len(checkArray)
            if n>=2:#nは最低2こ必要 最後と最後の1こ前の
                print("[n-1][0]",checkArray[n-1][0])#0番目の1個目 [0](0,1)
                print("[n-2][1]",checkArray[n-2][1])#0番目の2個目
                #個数はNだけど配列の指定はそれより1小さいのでN-1となる
                if (checkArray[n-1][0]-checkArray[n-2][1])>=6:
                    print("putで抜けている")
                    #checkArray[n-1][1]の後ろに挿入する
                    texttmp=textout[:checkArray[n-2][1]+2]+ '0' + textout[checkArray[n-2][1]+2:]
                    textout=texttmp
       
            #置換して終わる
            output=kuro.sub(',',textout)
    elif opt=='put':
    #putのみの場合
        #3つのカンマを付ける
        output=',,,'+kuro.sub(',',textout)#>>,,,26250,285,-10,189
    #end if
 
    return output
### end def

###本文 ここでoutMojiMK()メソッドを使用している
path='/Users/toshiromaseda/Documents/2020年株関連/kabu_python/'
os.chdir(path)#ディレクトリ変更
print(os.getcwd())#ディレクトリ確認
ifile='pythontest.txt'#sys.argv[1] このスクリプトと同じ階層ならパスは不要 

try:
    ofile=open('c_'+ifile.split('.')[0]+'.csv','tw') 
except FileNotFoundError as e: # FileNotFoundErrorは例外クラス名
   print("ファイルが見つかりません", e)
except Exception as e: # Exceptionは、それ以外の例外が発生した場合
   print(e)

try:#ファイルが存在しないときのエラー処理try
    with open(ifile,'tr') as fin:
        for iline in fin:
            #ilineに、”コール”、”出来高”の文字がある行は無視するようにする
            #countで探すか 1行目、2行目は不要なのでDBにインサートしないための処理
            if iline.count('コール')>=1 or iline.count('出来高')>=1:
                continue#以下は実行されない
            try:
                ofile.write(outMojiMK(iline)+'\n')

            except Exception:
                print("do not")
        ofile.close()
except FileNotFoundError as e: # FileNotFoundErrorは例外クラス名
    print("ファイルが見つかりません", e)
    ofile.close()
except Exception as e: # Exceptionは、それ以外の例外が発生した場合
   print(e)


print("CSV出力終わりました。")

修正が必要だったので改良したものがこちら。Put側にも抜けた文字が存在したので、0を挿入するようにした。↓2020/12/18

#MKIII対応版、2020/12/18 こちらが修正版になる。違いはlatterHalf()とMKIII()になったこと。
#違いは、put側でも抜けた文字が存在したので抜けた文字があった場合0を挿入する部分を入れた
#opt=='onlycall' 'callandput' putのみも前半は同じ処理が必要だった。
#putのみにも挿入処理を入れた。2020/12/18
import re
import sys
import os
#ファイル名は下に指定する。

#文字列の後ろ側の数字を後ろから探し、抜けていた場合0を埋める
def latterHalf(text):
    textout=text
    pattern=re.compile('[0-9]+')#findで正規表現ができない
    i = 0
    checkArray=[]#タプルを入れる配列
    while i >= 0:#数字を探す
      m = pattern.search(textout, i)
      if m:
        #print(m.start())
        #print(m.end())
        #これをタプル配列に入れて、N,N-1で差が大きいときに0を入れる
        #print(m.span())
        checkArray.append(m.span())
        i = m.end()#m.start() + 1#m.end()
      else:
        break
    #print("len checkArray",len(checkArray))
    #次はここから、2020/12/17
    n=len(checkArray)
    if n>=2:#nは最低2こ必要 最後と最後の1こ前の
        #print("[n-1][0]",checkArray[n-1][0])#0番目の1個目 [0](0,1)
        #print("[n-2][1]",checkArray[n-2][1])#0番目の2個目
        #個数はNだけど配列の指定はそれより1小さいのでN-1となる
        if (checkArray[n-1][0]-checkArray[n-2][1])>=6:
            print("put抜けている")
            #checkArray[n-1][1]の後ろに挿入する
            texttmp=textout[:checkArray[n-2][1]+2]+ '0' + textout[checkArray[n-2][1]+2:]
            textout=texttmp
    output=textout
    return output
#end def

def outMojiMKIII(text):
    #空白を削除する前に、空白の個数を数える
    #株探の仕様が変わったらここを変える。2020/12/16
    kuro=re.compile('[  ]+')#半角と全角の空白置換 半角全角が[半角全角]として入っている
    
    if text.count(' ',0,15)>=13:
           #空白13個はプット
            opt='put'
            textout=text.strip()#先頭、末尾の空白を削除する
    else:
            #コールの場合、2種類あるのでそれをチェックする
            textout=text.strip()#先頭、末尾の空白を削除する
            check=kuro.sub(',',textout)#半角全角の空白を置換
            count=check.split(",")
            #print ('len count:',len(count))
            if len(count)>=5:#配列が5個以上なら、call,putが含まれる       
                opt='callandput'
            else:
                opt='onlycall'
    pattern=re.compile('[0-9]+')#findで正規表現ができない
    if opt=='onlycall' or opt=='callandput':
        #次に、「call,putあり」OR「Callのみ」かをチェックする。
        #optSub='callandput' 'onlycall'
        #callのみを先に処理して、put側を調べる
        matchobj=re.search('[0-9]+',textout)#最初の数字を探す
        if matchobj:
            #print('マッチした文字列:'+matchobj.group())
            #print('マッチした文字列グループ:',matchobj.groups())
            #print( '開始位置'+str(matchobj.start()) )#先頭位置は0番として数える 3番目(4文字目)に見つかった
            #print( '終了位置'+str(matchobj.end()) )#終了位置は次の番目を含んでいるので実際は1を引いた数が終了位置
            #print(matchobj.span())#'マッチした文字列の (開始位置, 終了位置) のタプル'+
            #2番めの数字を探す
            secondMatch=pattern.search(textout,matchobj.end())#compileを使用してpatternで再度位置を指定して探す
            if secondMatch:
                #print( '開始位置2:'+str(secondMatch.start()) )#先頭から数えて10番目に次の数字が見つかった
                #1番目と2番めの文字数が5以上空いていたら数字が抜けている事がわかる。
                #ここに0を埋める処理を入れる
                if secondMatch.start()-matchobj.end() >=5:
                    print('値が抜けてる')
                    # hash = "355879ACB6"
                    # hash = hash[:4] + '-' + hash[4:]
                    #文字列の挿入。#1番目の文字の3文字目くらいに0を追加する。
                    texttmp=textout[:matchobj.end()+2]+ '0' + textout[matchobj.end()+2:]
                    textout=texttmp
        #put側のチェック。再度optでチェックする
        if opt=='onlycall':
            #置換して終わる
            output=kuro.sub(',',textout)+',,,'
        elif opt=='callandput':
            print('callandputの処理')
            tmp=latterHalf(textout)#後半PUTの処理をして文字を返す
       
            #置換して終わる
            output=kuro.sub(',',tmp)
    elif opt=='put':
    #putのみの場合
        #3つのカンマを付ける
        tmp=latterHalf(textout)#後半PUTの処理をして文字を返す
        output=',,,'+kuro.sub(',',tmp)#>>,,,26250,285,-10,189
    #end if
 
    return output
### end def

###本文 ここでoutMojiMKIII()メソッドを使用している
path='/Users/toshiromaseda/Documents/2020年株関連/kabu_python/'
os.chdir(path)#ディレクトリ変更
print(os.getcwd())#ディレクトリ確認
ifile='2020年12月18日AM8時39分.txt'#sys.argv[1] このスクリプトと同じ階層ならパスは不要 

try:
    ofile=open('c_'+ifile.split('.')[0]+'.csv','tw') 
except FileNotFoundError as e: # FileNotFoundErrorは例外クラス名
   print("ファイルが見つかりません", e)
except Exception as e: # Exceptionは、それ以外の例外が発生した場合
   print(e)

try:#ファイルが存在しないときのエラー処理try
    with open(ifile,'tr') as fin:
        for iline in fin:
            #ilineに、”コール”、”出来高”の文字がある行は無視するようにする
            #countで探すか 1行目、2行目は不要なのでDBにインサートしないための処理
            if iline.count('コール')>=1 or iline.count('出来高')>=1:
                continue#以下は実行されない
            try:
                ofile.write(outMojiMKIII(iline)+'\n')#MKIII改良版2020/12/18

            except Exception:
                print("do not")
        ofile.close()
except FileNotFoundError as e: # FileNotFoundErrorは例外クラス名
    print("ファイルが見つかりません。パス、ファイル名を確認してください", e)
    ofile.close()
except Exception as e: # Exceptionは、それ以外の例外が発生した場合
   print(e)


print("CSV出力終わりました。",ifile)

 

pythonサンプル 空白と数字が含まれたTXTを読み込んで、CSVカンマファイルとして出力するためのメソッド

#改良版 メソッド
#次の改良版、列の数が一部欠落したデータの対応、2020/12/16
#空白と数字が含まれたTXTを読み込んで、CSVカンマファイルとして出力するためのメソッド Shift+Enterで実行する。
#必要なファイルは、株探のニュースのオプションのコピペしたテキストファイル。この仕様は下の方に記載されている数字を取得する
#参考
#https://qiita.com/earth06/items/9e6bdb3a573272619983

#参考、https://hibiki-press.tech/python/isdigit/899#toc2

#例外を発見した 出来高があるのに、前日比がない、、ブランクだ、これはおかしい。なくても0のハズ
#この対応を考える。まだ2020年12月16日
#’   2  (ここがブランク)   1130  25750   180    -5   124 ’
#’   2  (ここがブランク)   1130  25750   180      (ここがブランク)   124 ’

#’  145    0   275  27125   685        23 ’#putが抜けた行
#’   71     1130  25750   180    -5   124 ’#call側なし行
#’  95    0    1  32000 ’#callのみ正常
#’             24000   38    -1   533 ’#putのみ正常

変数textの空白をカンマに置換する。TXT読み込みとCSV出力は次回記載予定

###########################################################################
import re
import sys
import os

text='             24000   38    -1   533 '


#文字列が数値でない場合FALSE。今回は使用せず
def is_int(s):
    try:
        int(s)
        return True
    except ValueError:
        return False
##参考まで


##
    #半角と全角の置換をする前に、出来高の次に前日比があるかをチェックする。
    #チェック方法
    #チェックは、出来高と価格の間に、前日比がないときは、空白の数が多いのでその数で、前日比が
    #入っていないことがわかる。
    #これから、2020/12/16
    #考え方1:先頭から数字1を探す。次に、その数字から次の半角を探して、また次の数字2を探す
    #数字1と数字2の間の空白が4以上空いていたら、前日比が存在しない。
    #find,re.search()を使う。ただしFindは正規表現が使えない。
def outMojiMK(text):
    #空白を削除する前に、空白の個数を数える
    #株探の仕様が変わったらここを変える。2020/12/16
    kuro=re.compile('[  ]+')#半角と全角の空白置換 半角全角が[半角全角]として入っている
    
    if text.count(' ',0,15)>=13:
           #空白13個はプット
            opt='put'
            textout=text.strip()#先頭、末尾の空白を削除する
    else:
            #コールの場合、2種類あるのでそれをチェックする
            textout=text.strip()#先頭、末尾の空白を削除する
            check=kuro.sub(',',textout)#半角全角の空白を置換
            count=check.split(",")
            print ('len count:',len(count))
            if len(count)>=5:#配列が5個以上なら、call,putが含まれる       
                opt='callandput'
            else:
                opt='onlycall'
    pattern=re.compile('[0-9]+')#findで正規表現ができない
    if opt=='onlycall' or opt=='callandput':
        #次に、「call,putあり」OR「Callのみ」かをチェックする。
        #optSub='callandput' 'onlycall'
        #callのみを先に処理して、put側を調べる
        matchobj=re.search('[0-9]+',textout)#最初の数字を探す
        if matchobj:
            #print('マッチした文字列:'+matchobj.group())
            #print('マッチした文字列グループ:',matchobj.groups())
            #print( '開始位置'+str(matchobj.start()) )#先頭位置は0番として数える 3番目(4文字目)に見つかった
            #print( '終了位置'+str(matchobj.end()) )#終了位置は次の番目を含んでいるので実際は1を引いた数が終了位置
            #print(matchobj.span())#'マッチした文字列の (開始位置, 終了位置) のタプル'+
            #2番めの数字を探す
            secondMatch=pattern.search(textout,matchobj.end())#compileを使用してpatternで再度位置を指定して探す
            if secondMatch:
                #print( '開始位置2:'+str(secondMatch.start()) )#先頭から数えて10番目に次の数字が見つかった
                #1番目と2番めの文字数が5以上空いていたら数字が抜けている事がわかる。
                #ここに0を埋める処理を入れる
                if secondMatch.start()-matchobj.end() >=5:
                    print('コールで値が抜けてる')
                    # hash = "355879ACB6"
                    # hash = hash[:4] + '-' + hash[4:]
                    #文字列の挿入。#1番目の文字の3文字目くらいに0を追加する。
                    texttmp=textout[:matchobj.end()+2]+ '0' + textout[matchobj.end()+2:]
                    textout=texttmp
        #put側のチェック。再度optでチェックする
        if opt=='onlycall':
            #置換して終わる
            output=kuro.sub(',',textout)+',,,'
        elif opt=='callandput':
            print('callandputの処理')
            #後ろの文字のチェックをする
            i = 0
            checkArray=[]#タプルを入れる配列
            while i >= 0:#数字を探す
              m = pattern.search(textout, i)
              if m:
                #print(m.start())
                #print(m.end())
                #これをタプル配列に入れて、N,N-1で差が大きいときに0を入れる
                #print(m.span())
                checkArray.append(m.span())
                i = m.end()#m.start() + 1#m.end()
              else:
                break
            print("len checkArray",len(checkArray))
            #次はここから、2020/12/17
            n=len(checkArray)
            if n>=2:#nは最低2こ必要 最後と最後の1こ前の
                print("[n-1][0]",checkArray[n-1][0])#0番目の1個目 [0](0,1)
                print("[n-2][1]",checkArray[n-2][1])#0番目の2個目
                #個数はNだけど配列の指定はそれより1小さいのでN-1となる
                if (checkArray[n-1][0]-checkArray[n-2][1])>=6:
                    #抜けている
                    print("putで抜けている")
                    #checkArray[n-1][1]の後ろに挿入する
                    texttmp=textout[:checkArray[n-2][1]+2]+ '0' + textout[checkArray[n-2][1]+2:]
                    textout=texttmp
       
            #置換して終わる
            output=kuro.sub(',',textout)
    elif opt=='put':
    #putのみの場合
        #3つのカンマを付ける
        output=',,,'+kuro.sub(',',textout)#>>,,,26250,285,-10,189
    #end if
 
    return output
### end def

###実行
print(outMojiMK(text))
#,,,24000,38,-1,533 出力例 変数textに記述内容をカンマをつけて出力する

 

MySQLでDB、テーブルを作成する、MacOS BigSur 2020年12月

MySQLのセキュリティ設定している人はここは飛ばす

$マークはMacのターミナルを使用している。
ターミナルは、アプリの「その他」の中にある。(何故かわかりにくいところに入れてある)

mysqlサーバを起動する
$ mysql.server start
Starting MySQL
. SUCCESS!

止めるときは
$ mysql.server stop

次にセキュリティ設定
このサイトを参考にすると良い
https://style.potepan.com/articles/19020.html

MySQLのセキュリティ設定

>>>>>>>>>>>>>>>>>>>以下入力した内容 ここから↓

$ mysql_secure_installation



Securing the MySQL server deployment.

Connecting to MySQL using a blank password.

VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?

Press y|Y for Yes, any other key for No: y

There are three levels of password validation policy:

LOW Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary file

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 0  >>0:LOWとした。本番環境なら2だ
Please set the password for root here.

New password:   >>パスワードを入れる

Re-enter new password:  >>パスワードの確認

Estimated strength of the password: 50
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Success.


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
- Dropping test database...
Success.

- Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.

All done!

 

>>>>>>>>>>>>>>>>>>>>ここまで

mysqlにRootでログインする。

$ mysql -u root -p
Enter password:   >>先程登録したパスワード
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.22 Homebrew

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

 

exitで抜ける
mysql> exit
Bye

ユーザの作成・削除

user:maseda
pass:Test1030 >>ここのパスワードは知られても気にしない。このパスワードを他で使わないから。

ユーザの作成
まずは
rootでログインする
mysql -u root -p
(pass)
以下はmysqlコマンドとして入力する。masedaユーザを作成
一人でしか使わないが、今後誰かと共同作業があるかもしれないので勉強のために
ユーザを作る。

create user ‘maseda’@localhost identified by ‘Test1030’;
作成したユーザの確認

select user, host from mysql.user;

mysql> select user, host from mysql.user;
+------------------+-----------+
| user | host |
+------------------+-----------+
| maseda | localhost |
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+------------------+-----------+
5 rows in set (0.00 sec)

 

MySQLの設定をしている人はここから作業をする。

root権限でユーザにグローバルレベルでcreate権限を与える。すべてのDBで使える。
制限するときは、DB名を指定するが今はしない。

権限を与える。必要なときに必要な分を与える
grant create on *.* to maseda@localhost;
GRANT SELECT,UPDATE,INSERT,DELETE ON *.* to maseda@localhost;
GRANT DROP,CREATE VIEW,ALTER,EXECUTE,INDEX,SHOW DATABASES,SHOW VIEW,FILE ON *.* to maseda@localhost;

exitでrootを抜ける。

→次はここから、2020/12/15
ユーザでログイン
mysql -u maseda -p
psssはTes*****にした。上に記載。このパスワードはデモ用なので知られてOK

次にデータベースを作成して、テーブルを作る。
そしてCSVファイルを読み込む

自動採番の例 auto_increment
>>create table staff(id int auto_increment, name varchar(10), index(id));

今回作成するDB(Stock)とテーブル(Table_StockOption)を作成

株探のオプション記事の数値をDB化する。
作成の例
DB:Stock
Table:Table_StockOption
・カラム
ID:id , int auto_increment、自動採番
出来高1 Volume1
前日比1 Change1
価格1 Price1
行使価格 ExercisePrice
価格2 Price2
前日比2 Change2
出来高2 Volume2
月限 Month , 例 12月限 12
取引日付、株探掲載日付 OptionDate ,date , DATE(NOW()) >> 2014-01-15
テーブル取り込み作成日 CreateDate ,datetime, NOW() >>2014-01-15 17:05:43
予備 (テキスト),text

//正負を表す ‘-‘ や ‘+’ を記述することができる。+10の+記号はINT型で可能
挿入時は+記号はない。10となり、マイナスは-10となる
NULLは処理速度が遅くなるのでできるだけ使わない。空にしたくないなら-1とか’unknown’とか入れる
大量のデータがないときはそれほど考慮しなくてよいだろう。

・ユーザはmaseda

・DBを作成
CREATE DATABASE Stock DEFAULT CHARACTER SET utf8mb4;

・DBを指定する
use Stock;

・テーブルを作成
CREATE TABLE Table_StockOption(
ID int(11) NOT NULL AUTO_INCREMENT,
Volume1 int(11),
Change1 int(11),
Price1 int(11),
ExercisePrice int(11) NOT NULL,
Price2 int(11),
Change2 int(11),
Volume2 int(11),
Month int(2),
OptionDate DATE,
CreateDate DATETIME,
YOBI text,
PRIMARY KEY (ID)
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

>>PRIMARY KEY(ID)が必要。ないとエラーになる。

mysql> show tables;
+-------------------+
| Tables_in_stock |
+-------------------+
| Table_StockOption |
+-------------------+

mysql> show columns from Table_StockOption;
ERROR 1142 (42000): SELECT command denied to user ‘maseda’@’localhost’ for table ‘table_stockoption’
mysql>
この場合権限がないので、権限を与える。
GRANT SHOW DATABASES ON *.* to maseda@localhost;
これでいいはず。もしこれでだめな場合は、必要な権限を与えて。
以下はカラム一覧を表示

mysql> show columns from Table_StockOption;
+---------------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+----------+------+-----+---------+----------------+
| ID | int | NO | PRI | NULL | auto_increment |
| Volume1 | int | YES | | NULL | |
| Change1 | int | YES | | NULL | |
| Price1 | int | YES | | NULL | |
| ExercisePrice | int | NO | | NULL | |
| Price2 | int | YES | | NULL | |
| Change2 | int | YES | | NULL | |
| Volume2 | int | YES | | NULL | |
| Month | int | YES | | NULL | |
| OptionDate | date | YES | | NULL | |
| CreateDate | datetime | YES | | NULL | |
| YOBI | text | YES | | NULL | |
+---------------+----------+------+-----+---------+----------------+
12 rows in set (0.01 sec)

 

これでテーブルの作成まで終わった。
次は、株探からコピペしたテキストをCSVファイルに置き換えて
mysqlに取り込む作業。
まずは、PythonでCSVファイルに変更するスクリプトを書く

BigSurにbrew,mysqlインストール、環境MacOSXからBigSurにアップグレードしたら

詳細な説明はこっち
https://style.potepan.com/articles/19020.html

簡潔な説明はこっち
https://qiita.com/fuwamaki/items/194c2a82bd6865f26045

mysql –versionを実行したところmysqlはまだインストールされていなかった。
次にbrewのバージョンを確認、
$ brew -v

以下のようなエラーが発生した。調べるとMac OSをBigSurにバージョンアップしたことが原因で、
brewもアップグレードが必要
>>エラーの内容

Traceback (most recent call last):
11: from /usr/local/Homebrew/Library/Homebrew/brew.rb:23:in `<main>'
10: from /usr/local/Homebrew/Library/Homebrew/brew.rb:23:in `require_relative'
9: from /usr/local/Homebrew/Library/Homebrew/global.rb:37:in `<top (required)>'
8: from /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
7: from /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
6: from /usr/local/Homebrew/Library/Homebrew/os.rb:3:in `<top (required)>'
5: from /usr/local/Homebrew/Library/Homebrew/os.rb:21:in `<module:OS>'
4: from /usr/local/Homebrew/Library/Homebrew/os/mac.rb:58:in `prerelease?'
3: from /usr/local/Homebrew/Library/Homebrew/os/mac.rb:24:in `version'
2: from /usr/local/Homebrew/Library/Homebrew/os/mac.rb:24:in `new'
1: from /usr/local/Homebrew/Library/Homebrew/os/mac/version.rb:26:in `initialize'
/usr/local/Homebrew/Library/Homebrew/version.rb:368:in `initialize': Version value must be a string; got a NilClass () (TypeError)

以下の3つのコマンドを順に実行した。brew doctorは必須ではないかも、、、

$ brew update
>>暫く待つ、アップデートが裏で始まっている。5分ほど待つ
$ brew doctor
>>Warningがでるけどよくわかんないのでそのまま
$ brew upgrade
>>暫く待つ、画面上に色々とインストール状況が表示される

やっとインストールできた。

$ brew --version
Homebrew 2.6.2
Homebrew/homebrew-core (git revision dc0df; last commit 2020-12-15)
Homebrew/homebrew-cask (git revision 6217f8; last commit 2020-12-15)

mysqlをインストール
$ brew install mysql

バージョンを確認
$ mysql –version
mysql Ver 8.0.22 for osx10.16 on x86_64 (Homebrew)
##################やっとインストールできた。

python メソッド、半角と全角の置換、CSV向け

#メソッドを使った。メソッドは先に記述されていないと、関数呼び出しでエラーになる。
#次は先頭から空白が13個以上の場合は、カンマを4つ追加する仕様に対応する
text='             26250   285    -10   189 '
ntext='  42   -5   655  26375   330    -5   226 '#'42,-5,655,26375,330,-5,226'
#outMoji(text)#ここにメソッドを書くとnot definedとなる

def outMoji(text):
    #空白を削除する前に、空白の個数を数える
    #株探の仕様が変わったらここを変える。2020/12/16
    if text.count(' ',0,15)>=13:
           #空白13個はプット
            opt='put'
            print('13こある')
    else:
            #はじめからあればコール このときは何もしない
            opt='call'

    textout=text.strip()#先頭、末尾の空白を削除する
    kuro=re.compile('[  ]+')#半角と全角の置換 半角全角が[半角全角]として入っている
    if opt=='put':
        #3つのカンマを付ける
        print('カンマを付けた↓')
        output=',,,'+kuro.sub(',',textout)#>>,,,26250,285,-10,189
    else:
        output=kuro.sub(',',textout)
    return output


###ここに関数を書く
outMoji(ntext)

#>>結果はOK ,,,26250,285,-10,189

 

pythonで置換、re、compile全角半角スペースを含んだ文字列から数字だけを取得してカンマ区切

#shift+enterで実行できる。2020/12/16
#2020/12/16 anaconda,JupypterLabを使用、MacOS BigSur

#参考にしたサイト
#https://uxmilk.jp/8662
#https://qiita.com/earth06/items/9e6bdb3a573272619983

import re
import sys

 

 

#全角半角スペースを含んだ文字列から数字だけを取得してカンマ区切りにしたい

#pattern=re.compile(' +') #' +'で一文字以上のスペースを正規表現のパターンとして定義
#|でORになる
pattern=re.compile(' +')
print(pattern.sub(',','1 1'))#カンマに置き換え >>'1,1'
#
test=re.compile(' +| +')#半角と全角の置換
print(test.sub(',','1 1  2'))#>>'1,1,2'

 

####
####
hoge=re.compile(' +| +')#半角または全角の置換
print(hoge.sub(',','             26250   285    -10   189 '))
#>>,26250,,285,,,-10,,189, カンマが複数あって、これだとだめだな。

####
####
aka=re.compile('[  ]+')#半角と全角の置換 半角全角が[半角全角]として入っている
print(aka.sub(',','             26250   285    -10   189 '))
#>>,26250,285,-10,189,  #カンマが1つずつになる

 

####
####

kiro=re.compile('[  ]+')#半角と全角の置換 半角全角が[半角全角]として入っている
print(kiro.sub(',','  42   -5   655  26375   330    -5   226 '))
#>>,42,-5,655,26375,330,-5,226,
#先頭のカンマが邪魔だ、空白は取りたい

 

####

#先頭と末尾に空白が含んだ文字列から数字だけを取得したい
moji='  42   -5   655  26375   330    -5   226 '
mojiout=moji.strip()#先頭、末尾の空白を削除する
print(mojiout)#>>42   -5   655  26375   330    -5   226
midori=re.compile('[  ]+')#半角と全角の置換 半角全角が[半角全角]として入っている
print(midori.sub(',',mojiout))
#>>42,-5,655,26375,330,-5,226 #先頭のカンマがなくなる
#やっと数字が取得できた

 

さくらレンタルサーバのMySQLのバージョンアップ5.5から5.7

さくらレンタルサーバのMySQLのバージョンアップ5.5から5.7

ワードプレスの推奨が5.6以上らしい。バージョンアップしたほうが速度が改善するしセキュリティも強化される。
アップグレード設定をして予約すると指定した時間にアップグレードしてくれる。
続きを読む

Python自動化、 jupyter lab、楽天証券から株価を取得した、 ModuleNotFoundErrorエラー 調査中からの解消へ

Python、 jupyter labを使って株価取得をする自動化プログラム。
株価を取得するコードを勉強中、環境はMacOS BigSur
jupyter labを使う理由は視覚的にPythonを実行できて、株価チャートが作成できるから。でもチャートを作る予定は今の所ない。

・現在の管理者のスキル:jupyterLab初心者

・症状

seleniumはpip3でインストールしたのに、Labでエラーになる。
ModuleNotFoundErrorエラー
—————————————————————————
ModuleNotFoundError Traceback (most recent call last)
in
4 import sys
5 import time
—-> 6 from selenium import webdriver
7 import csv
8 import datetime

ModuleNotFoundError: No module named ‘selenium’
続きを読む

Python3 モジュールインストールWEB関連 メモ

Python3 モジュールインストールWEB関連 メモ

Python3がMac OSXにインストールされている。

以下のモジュールがインストールされていないときに実行する

pip3 install requests
pip3 install beautifulsoup4

参考サイト

https://techacademy.jp/magazine/22302

https://qiita.com/__init__/items/d53a281ef757b22f4732