2019年2月22日金曜日

VBA関連

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
★セットもの★
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

Public Function shapeExists(sName) '--- シェープ存在確認

Dim objShp As Shape

On Error GoTo NO_OBJECT
If IsObject(wks_main.Shapes(sName)) Then
shapeExists = True
End If

Exit Function

NO_OBJECT:
shapeExists = False
Err.Clear

End Function


Public Sub ReplaceShapeText(sp As Shape, searchText, replaceText)

On Error Resume Next

Dim sp2 As Shape
Dim t As String

If sp.Type = msoGroup Then
For Each sp2 In sp.GroupItems
ReplaceShapeText sp2, searchText, replaceText
Next
Else
t = sp.TextFrame.Characters.Text
'矢印などテキスト設定できないシェイプの場合はエラーになる
If Err Then
Call Err.Clear
Else
sp.TextFrame.Characters.Text = Replace(t, searchText, replaceText)
End If
End If

End Sub

Public Sub ReplaceAllShapeText(searchText, replaceText)

Dim sh As Worksheet
Dim sp As Shape

Set sh = Application.ActiveSheet

For Each sp In sh.Shapes
ReplaceShapeText sp, searchText, replaceText
Next

Set sh = Nothing

End Sub

'*****
' ファイルの文字コードをSJISからUTF8(BOM無し)に変換する
Private Sub convertCharCode_SJIS_to_utf8(infile As String, outfile As String)
Dim destWithBOM As Object: Set destWithBOM = CreateObject("ADODB.Stream")

With destWithBOM
.Type = 2
.Charset = "utf-8"
.LineSeparator = 10 'LF
.Open
' ファイルをSJIS で開いて、dest へ 出力
With CreateObject("ADODB.Stream")
.Type = 2
.Charset = "shift-jis"
.Open
.LoadFromFile infile
.Position = 0
Do While Not .EOS
destWithBOM.WriteText .ReadText(-2), 1
Loop
.Close
End With
' BOM消去
' 3バイト無視してからバイナリとして出力
.Position = 0
.Type = 1 ' adTypeBinary
.Position = 3
Dim dest: Set dest = CreateObject("ADODB.Stream")
With dest
.Type = 1 ' adTypeBinary
.Open
destWithBOM.copyTo dest
.savetofile outfile, 2
.Close
End With
.Close
End With
End Sub

Public Sub codeChange(Filename, changeFile)

Dim FirstObj As Object
Dim SecondObj As Object

Set FirstObj = CreateObject("ADODB.Stream")

With FirstObj
.Type = 2
.Charset = "UTF-8"
.Open
.LoadFromFile Filename
.Position = 0
End With

Set SecondObj = CreateObject("ADODB.Stream")

With SecondObj
.Type = 2
.Charset = "shift-jis"
.Open
End With

FirstObj.copyto SecondObj

SecondObj.Position = 0

NewFilename = changeFile

SecondObj.savetofile NewFilename, 2

End Sub

Function SumColor(計算範囲, 条件色セル)

'--- 初期化
SumColor = 0

SumColorIndex = 条件色セル.Interior.ColorIndex

For x = 1 To 計算範囲.Count

If 計算範囲(x).Interior.ColorIndex = SumColorIndex Then

SumColor = SumColor + 計算範囲(x)

End If

Next

End Function

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
★FileSystemObject関連★
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★


'--- 宣言
Dim FSO As Object
Set FSO = CreateObject("Scripting.FileSystemObject")
Set FSO = Nothing

'--- ファイル確認してから削除
If FSO.FileExists(createName) Then
FSO.DeleteFile createName
End If

If FSO.FileExists(Target) = True Then: FSO.DeleteFile oFile

'--- 新規ファイル作成
With FSO.CreateTextFile(createName)
.WriteLine "aaa"
.Close
End With

'--- 書き込み(追記)
With FSO.GetFile(oFile).OpenAsTextStream(8)
.writeLine getJOB(j)
.write trimData '// 改行なし
.Close
End With

'--- 新規ファイル作成
FSO.CreateTextFile FilePath

FSO2.GetFile(FilePath).OpenAsTextStream(8).Write buf(i)
FSO2.GetFile(FilePath).OpenAsTextStream(8).WriteLine buf(i)

'--- 読み込み
Infile = Split(FSO.GetFile(File.Path).OpenAsTextStream.ReadAll, vbCrLf)
For i = 0 To UBound(Infile)
next i
FSO.GetFile(File.Path).OpenAsTextStream.Close

'--- 上書き確認なし(存在する場合はエラー)
FSO.CopyFile dataMae, dataAto

'--- 上書きでファイルコピー
FSO.CopyFile motoName, sakiName, True

'--- このフォルダ内のファイルの探索
For Each objFile In objFSO.GetFolder(Trim(infolderPath)).Files
With objFile
objFile.Path, outfolderPath & "\" & objFile.Name
End With
Next objFile


★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
★特殊関連★
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

'--- ダブルコーテーションの別の書き方
trimData = Chr(34) & trimData & Chr(34)

'--- application関連
Application.ScreenUpdating = False
Application.DisplayStatusBar = True
Application.StatusBar = False

'--- 数式の計算をロック実行
Application.Calculation = xlCalculationManual
'--- 数式の計算をロック解除
Application.Calculation = xlCalculationAutomatic

'--- ポップアップ抑止
Application.DisplayAlerts = False
ThisWorkbook.Worksheets("sort").Delete
Application.DisplayAlerts = True

'--- enabled
Application.EnableEvents = False
Application.Undo
Application.EnableEvents = True


★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
★判定関連★
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

If IsNumeric(sRow) = True Then
If IsEmpty(buf(i, 1)) = True Then
If IsDate(buf(i, TY_STR)) Then
If FoundCell Is Nothing Then
If IsObject(wks_main.Shapes(sName)) Then

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
★備忘録関連★
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
ETLの解析系きっついは XMLのやつ。htmlじゃなくて。
印刷君もきついわ

'★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
'★ツールバー作成
'★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
Private Sub Workbook_Open()

'--- ショートカットキー設定
Application.OnKey "{F1}", "gantoPlot"

On Error Resume Next

For i = 1 To Application.CommandBars(39).Controls.Count

If Application.CommandBars(39).Controls(i).Caption = "行追い出し処理" Then

Application.CommandBars(39).Controls("行追い出し処理").Delete

End If

Next i

'--- ツールバー新規作成
Dim MyCellMenu As CommandBarControl
Set MyCellMenu_01 = Application.CommandBars(39).Controls.Add

With MyCellMenu_01
.Caption = "行追い出し処理"
.OnAction = "backUp_Row"
End With

Set MyCellMenu_01 = Application.CommandBars(42).Controls.Add

With MyCellMenu_01
.Caption = "行追い出し処理"
.OnAction = "backUp_Row"
End With

'--- 標準用
For i = 1 To Application.CommandBars(39).Controls.Count

If Application.CommandBars(39).Controls(i).Caption = "行追い出し処理" Then

Application.CommandBars(39).Controls("行追い出し処理").Delete

End If

Next i

'--- 改ページプレビュー用
For i = 1 To Application.CommandBars(42).Controls.Count

If Application.CommandBars(42).Controls(i).Caption = "行追い出し処理" Then

Application.CommandBars(42).Controls("行追い出し処理").Delete

End If

Next i


'★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
'★いろいろ
'★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

'--- オートシェイプいろいろ
sRow = 1
SheetMax = ThisWorkbook.Worksheets.Count

For j = 1 To SheetMax
shapeMax = ThisWorkbook.Worksheets(j).Shapes.Count
For i = 1 To shapeMax
If InStr(ThisWorkbook.Worksheets(j).Shapes.Item(i).Name, "Rectangle") > 0 Then
ThisWorkbook.Worksheets("Shape").Cells(sRow, "A") = ThisWorkbook.Worksheets(j).Name
ThisWorkbook.Worksheets("Shape").Cells(sRow, "B") = ThisWorkbook.Worksheets(j).Shapes.Item(i).TextEffect.Text sRow = sRow + 1
End If
Next i
Next j

'--- 最終行判定
LastPosi = Range(joukyou & "65536").End(xlUp).Row + 1

'--- エクセル関数使う場合
実績工数 = Application.WorksheetFunction.Sum((Range(colS_A & i & ":" & colE_A & i)))

'--- 曜日の編集論理
calBuf(2, i) = Mid$(WeekdayName(Weekday(calBuf(1, i))), 1, 1)

'--- 祝日判定(営業日が0なら祝日とみなす)
workCnt = Application.WorksheetFunction.NetworkDays(calBuf(1, i), calBuf(1, i), holidayRange)

'--- 重み設定
wks_main.Range(col_PlanWeight1(A) & "4") = "=IF(ISERROR(VLOOKUP(" & col_PlanWorkMember(A) & "4" & ",設定!C:D,2,FALSE)),1,VLOOKUP(" & col_PlanWorkMember(A) & "4" & ",設定!C:D,2,FALSE))"

'--- 計画想定日数2(小数点以下四捨五入する)
wks_main.Range(col_PlanAssumpDate2(A) & "4") = "=ROUND(" & col_PlanAssumpDate1(A) & "4" & ",0)"

'--- 計画想定終了日
wks_main.Range(col_PlanAssumpDateE(A) & "4") = "=WORKDAY(" & col_PlanAssumpDateS(A) & "4" & "," & col_PlanAssumpDate2(A) & "4" & ",設定!$A$2:$A$40)"

rData = Application.VLookup(CLng(sDate), ThisWorkbook.Worksheets("作業工数情報(計画)").Range("F:I"), 4, False)

If Application.WorksheetFunction.NetworkDays(sDate, sDate, ThisWorkbook.Worksheets("設定").Range("$A$2:$A$40")) = 1 Then


'---シートクリアー
ThisWorkbook.Worksheets("分析_タスク確認用").rowS("2:1048576").ClearContents

'--- ピボットテーブル更新
ThisWorkbook.Worksheets("タスク状況確認").PivotTables("ピボットテーブル2").PivotCache.Refresh

'--- グラフ範囲更新
ThisWorkbook.Worksheets("EVM確認").ChartObjects("グラフ 17").Chart.SetSourceData Source:=Range("EVM確認!$A$1:$A$" & i & ",EVM確認!$G$1:$H$" & i)

'--- 列名取得(数字からアルファベットに変換)
colE = Split(wks_main.Cells(1, colS - 1).Address, "$")(1)
colE_A = Split(wks_main.Range(colS_A & rowDate).End(xlToRight).Address, "$")(1)

'--- ショートカットキーと関数紐付
Application.OnKey "{F1}", "gantoPlot"

'--- 対象範囲一括置換
Workbooks(File.Name).Activate
Workbooks(File.Name).Worksheets(sMin).Activate
Range("A1:DP5000").Select '--置き換え対象範囲を選択します
With Selection
.Replace What:="IPOBC", Replacement:="IPOBQ", LookAt:=xlPart
End With

'--- 曜日の編集論理
calBuf(2, i) = Mid$(WeekdayName(Weekday(calBuf(1, i))), 1, 1)

'--- 曜日
ThisWorkbook.Worksheets("分析_担当者別計画確認用").Cells(sRow, "D") = Mid(WeekdayName(Weekday(j)), 1, 1)

'--- 種類
Select Case File.Attributes
Case 0: FileAttributes = "標準ファイル"
Case 1: FileAttributes = "読み取り専用ファイル"
Case 2: FileAttributes = "隠しファイル"
Case 4: FileAttributes = "システムファイル"
Case 8: FileAttributes = "ディスクドライブボリュームラベル"
Case 16: FileAttributes = "フォルダまたはディレクトリ"
Case 32: FileAttributes = "アーカイブファイル"
Case 64: FileAttributes = "リンクまたはショートカット"
Case 128: FileAttributes = "圧縮ファイル"
Case Else: FileAttributes = "不明"
End Select

'--- FSOのやつ
ThisWorkbook.Worksheets(2).Cells(cnt, "A") = File.Path
ThisWorkbook.Worksheets(2).Cells(cnt, "B") = File.Name
ThisWorkbook.Worksheets(2).Cells(cnt, "C") = File.ParentFolder.Name
ThisWorkbook.Worksheets(2).Cells(cnt, "D") = File.ParentFolder.ParentFolder.Name
ThisWorkbook.Worksheets(2).Cells(cnt, "E") = FileAttributes
ThisWorkbook.Worksheets(2).Cells(cnt, "F") = File.Type

'--- ↓ わーくぶっくおーぷん
Workbooks.Open Filename:=File.Path, ReadOnly:=True, UpdateLinks:=0

'--- フリーズ抑止
DoEvents

'--- 印刷範囲変更
Workbooks(Dir(File.Path)).Worksheets(1).PageSetup.PrintArea = Workbooks(Dir(File.Path)).Worksheets(1).Range("A1:AE" & i).Address

'★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
'★IE関連
'★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

Dim objIE As InternetExplorer
Dim objShell As Object, objWin As Object
Dim objDoc As HTMLDocument

Set objShell = CreateObject("Shell.Application")

For Each objWin In objShell.Windows
If InStr(objWin.LocationURL, "IPOBC701PointGrantCondList.jsp") > 0 Then
Set objIE = objWin
Exit For
End If
Next

For i = 0 To objIE.document.getElementsByTagName("td").Length - 1
If objIE.document.getElementsByTagName("td")(i).Width = "80%" Then
getCodeId = Trim(objIE.document.getElementsByTagName("td")(i).innerHTML)
getCodeName = Trim(objIE.document.getElementsByTagName("td")(i).PreviousSibling.innerHTML)
If objIE.document.getElementsByTagName("input")(i).Type = "checkbox" And _
InStr(objIE.document.getElementsByTagName("input")(i).Name, "shopSelect") > 0 Then
objIE.document.getElementsByName(IE_List(j, 1)).Item.Checked = False

'★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
'★いろいろ
'★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
'***
svnリームー

'************************

'--- 座標の調べ方
G_TOP = wks_main.Cells(rowS+0, InazumaColI).Top
G_BOT = wks_main.Cells(rowS+1, InazumaColI).Top
G_LFT = wks_main.Cells(rowS+1, InazumaColI).left

'--- シェープの横幅
dwidth = wks_main.Shapes(shapeName).Width

'--- シェープの書き方(四角形)
With wks_main.Shapes.AddLine(p1, p2, p3, p4)
.Name = pName
.Line.DashStyle = msoLineSolid
.Line.Weight = 2
End With

'--- シェープの書き方(横線)
With wks_main.Shapes.AddConnector(msoConnectorElbow, 0, 0, 0, 0)
.Line.EndArrowheadStyle = msoArrowheadTriangle
With .ConnectorFormat
.BeginConnect wks_main.Shapes("予定線" & Format(i, "000")), 4
.EndConnect wks_main.Shapes("予定線" & Format(setRow, "000")), 1
End With
End With

'--- 予定のシェープ調べ方
shapeMax = wks_main.Shapes.Count
shapeMin = 1

hitF = 0
Do While shapeMin <= shapeMax
shapeName = wks_main.Shapes(shapeMin).Name
If shapeName = "予定線" & Format(setRow, "000") Then
hitF = 1
Exit Do
End If
shapeMin = shapeMin + 1
Loop

'--- エクセル文字の取得方法
tEDate = wks_main.Range(TY_END_A & setRow).Text
tEDate = wks_main.Range(TY_END_A & setRow).value
tEDate = wks_main.Range(TY_END_A & setRow).value2

'--- セルのマージ方法
ThisWorkbook.Worksheets("マージ").Range(tCol & sRow & ":" & tCol & eRow).Merge

'--- 休日判定色塗り
Select Case calBuf(2, i)
Case "土": wks_main.Columns(i + colS - 1).Interior.Color = 16765331
Case "日": wks_main.Columns(i + colS - 1).Interior.Color = 12040191
Case Else
'--- 祝日判定も入れる
For j = 2 To 100
If ThisWorkbook.Worksheets("設定").Cells(j, "A") = "" Then: Exit For
If ThisWorkbook.Worksheets("設定").Cells(j, "A") = calBuf(1, i) Then
wks_main.Columns(i + colS - 1).Interior.Color = 12040191
End If
Next j
End Select

'--- 時間取りたいとき
getNow6S = CDbl(Timer)

'--- ファイルの開き方
Workbooks.Open Filename:=filePath
Workbooks(Dir(filePath)).Close savechanges:=True

'--- フォームの開き方
UserForm1.Show
Unload UserForm2

'--- UNIONして高速化(めちゃはや)
rng.Interior.Color = 12040191

'--- エクセル編集と関数
With wks_main.Range(cl_PlanAssumpDateS(A) & "2")
.Value = "=MIN(" & col_PlanAssumpDateS(A) & "4" & ":" & col_PlanAssumpDateS(A) & LastPosi & ")"
.NumberFormatLocal = "yy/mm/dd"
End With

'-- 集計値関数再設定(一律集計で設定)
With .Cells(sumRow, col_workPlanTime(N))
.Formula = "=SUM(" & func_RowStrtoRowEnd(col_workPlanTime, col_workPlanTime, sumRowSTR, LastPosi) & ")"
.AutoFill Destination:=wks_main.Range(col_workPlanTime(A) & sumRow & ":" & col_CPI(A) & sumRow), Type:=xlFillValues
End With

'--- デバック方法
Debug.Print "0: ALLTime--" & SetTimmer(1, 0) - SetTimmer(0, 0)

'--- ファイルコピー
Name copyMoto As copySaki

2017年12月20日水曜日

VBA FileSystemObject

★宣言

Dim FSO As Object
Set FSO = CreateObject("Scripting.FileSystemObject")
Set FSO = Nothing

★ファイル確認してから削除

If FSO.FileExists(createName) Then
FSO.DeleteFile createName
End If

'--- 1行表示の判定の書き方
If FSO.FileExists(Target) = True Then: FSO.DeleteFile oFile

★新規ファイル作成

'--- その1
With FSO.CreateTextFile(createName)
.WriteLine "aaa"
.Close
End With

'--- その2
FSO.CreateTextFile FilePath

★書き込み(追記)

'--- その1
With FSO.GetFile(oFile).OpenAsTextStream(8)
.writeLine getJOB(j)
.write trimData    '// 改行なし
.Close
End With

'--- その2
FSO2.GetFile(FilePath).OpenAsTextStream(8).Write buf(i)
FSO2.GetFile(FilePath).OpenAsTextStream(8).WriteLine buf(i)

★読み込み

Infile = Split(FSO.GetFile(File.Path).OpenAsTextStream.ReadAll, vbCrLf)
For i = 0 To UBound(Infile)
next i
FSO.GetFile(File.Path).OpenAsTextStream.Close

★ファイルコピー

'--- 上書き確認なし(存在する場合はエラー)
FSO.CopyFile dataMae, dataAto    

'--- 上書きでファイルコピー
FSO.CopyFile motoName, sakiName, True

★フォルダ内のファイルの探索

For Each objFile In objFSO.GetFolder(Trim(infolderPath)).Files
With objFile
objFile.Path, outfolderPath & "\" & objFile.Name
End With
Next objFile

2017年11月19日日曜日

SHELL実行高速化


色々やったので忘れないようにメモを残し

★SHELL高速化で分かったこと

  • ループの中で通常コマンドを使うと遅くなる。
  • bashを使えるならbashの方が速い。
  • ファイル検索は ls より find の方が速い。
  • ファイル削除は findのコマンドでそのまま削除できる。
  • 配列でIndexでループした方が速いときもある。
  • IFSコマンドは遅いから、ヒアドキュメントでやったほうがいい。 

★文字の置換

#書き方1
args=`echo $args | sed -e "s/変換前/変換後/g"`

#書き方2
args=${args//変換前/変換後}

★ファイルをループさせるとき

#書き方1
for infile in `ls ${infiles}`

#書き方2
for infile in `find ${infiles} -type f -prune -print

#書き方3
for kuwake_index in `seq 0 22`

★文字列の部分抽出

#書き方1
kuwake1=`echo ${文字列} | cut -c 1`

#書き方2
${文字列:0:1}

#書き方3
min=${文字列:14} #--- 長さを省略したら最後まで。

★配列変数の作りかた

file_AtoB=()
file_AtoB+=(aaaaaaa:bbbbbb)
file_AtoB+=(ccccccc:dddddd)

★ユーザー変えずにコマンド実行するやり方(SQLver)

su - スイッチユーザー -c "sqlplus  / @${MAIN_PATH}/実行SQL名.sql"

★関数を並列化して実行する書き方

#--- 関数
function table_backup(){
}
#--- いったん宣言する
export -f table_backup   
   
#--- xargs の後続に呼び出し関数を定義してやる
echo "${tableList}" | xargs -P5 -I% bash -c "table_backup % ${dateTime} ${exportPath} ${backupPath}"   

#--- 宣言解除
unset table_backup

★コマンド実行してechoと同じことするやつ

bash -v -c "ls -ltr  ${logDir}/"

★ファイル削除の高速化

#書き方1
find ${folder}/${file} -maxdepth 0 -mindepth 0 -type f -print -delete 

#書き方2
find ${folder}/${file} -maxdepth 0 -mindepth 0 -type f -print | xargs /bin/rm -f

★ファイル名日本語文字化けするときの対応方法

#---ファイル名の文字コードを変換するときには、convmv
#---CP932 sjisじゃなくてsjisをちょび拡張したものがwindowsの文字コード規格
#---書き方1
convmv -f cp932 -t utf-8 * --notest

#---書き方2
!/bin/sh
for sjis_name in `find .`
do
 utf8_name=`echo "${sjis_name}" | iconv -f SJIS -t UTF-8`
 if [ "${sjis_name}" != "${utf8_name}" ]; then
    mv "${sjis_name}" "${utf8_name}"
 fi
done

★SSH接続・リモートコマンド実行

exec setsid ssh $SSH_USER@$SSH_HOST $REMOTE_CMD

★ISCPコマンド発動

iscp /SEIIFS:SEIIFS@IPアドレス:ポート番号/${oldName} //${outPath}/${newName}';replace=on;binary'

★対象サーバーにログインしている人がいないか確認するコマンド

who -u


★HULFTコマンドを実行させるコマンド

#--- hulftのオプション設定
hul_args=$@

#--- hulftコマンド実行
/opt/hulft/bin/utlsend ${hul_args}


★権限付与するときのコマンド

#--- グループ権限付与前確認
cat /etc/group | grep uaa

#--- 権限付与
usermod -G 10, 12101, 12301, 21005, 21001 ${uName}

#--- グループ権限付与後確認
cat /etc/group | grep uaa

change -l    ${uName}
change -M 90 ${uName}
change -W 10 ${uName}
change -l    ${uName}

★変数に文字列を配列ちっくに持たせる書き方

tableList=`cat << EOS
文字列1
文字列2
EOS`

★日付の書き方

export LOG_DATE=`date "+%Y%m%d" --date '1 day ago'`

★SHELLの中でSQLを実行するやり方

SQLPLUS=${ORACLE_HOME}/bin/sqlplus
RESULT=`${SQLPLUS} -s / << EOF
set pagesize 0;
set head off;
set feed off;
SELECT CH_PROC_YYYY ||  CH_PROC_MM , CH_PROC_KIND, NM_PROC_CNT FROM TB_BCMHDK069
 WHERE CH_PROC_KIND_CD='${1}' AND CH_LATEST_STATE<>'5';
EXIT SQL.SQLCODE;
EOF`

#--- 後は判定分
SQLCODE=$?
if [ ${SQLCODE} -ne 0 ]

★一覧からあるものとないもの一覧を作成する

#--- 両方に存在するファイル名一覧を作成 (-12)
#--- 修正前のみに存在するファイル名一覧を作成 (-23)
#--- 修正前のみに存在するファイル名一覧を作成 (-13)

matchList=`bash -c "comm -12 <(cat  ${oldFileList}) <(cat  ${newFileList})"`
diffList1=`bash -c "comm -23 <(cat  ${oldFileList}) <(cat  ${newFileList})"`
diffList2=`bash -c "comm -13 <(cat  ${oldFileList}) <(cat  ${newFileList})"`


★ホスト名を自動で記載するやりかた

tar tvf ${dateS}_`uname -n`.tar.gz

★ファイルの一覧を取得する方法

#書き方1
input_files=`ls ${input_file_path}`

#書き方2
input_files=`find "${DATA_DIR}${APLWORK_OUTPUT}" -maxdepth 1 -mindepth 1 -type f -name ${input_file_name}`


★パイプを使わないでコマンド実行する方法

#書き方1
output_file_name=`echo ${args}|sed 's/.*-o //g'`

#書き方2
output_file_name=`sed <<< ${args} 's/.*-o //g'`

#書き方3
out1=`awk <<<  $command 'BEGIN{FS=";"}{print $3}'`


★当日日付

workDate=date '+%Y%m%d'


★JEFコードに変換して改行コードも変換する場合

echo "cat ${in_path}${outfile} | $ICONV_HOME/bin/iconv -a -f utf8 -t jefkana | tr '\045' '\012' > ${out_path}${outfile}"| tee -a ${LOG_FILE}


★IFSコマンドを実行する場合のやり方

set -f 
IFS_ORG=$IFS
IFS=';'
set -- ${CmdString}
option=$1
in_file=$2
out_file=$3

#IFS状態修正    ★ infileになってるかもだから注意  あと modeも元に戻しておくこと。
IFS=' '
infiles=$2
outfiles=$1
IFS=$IFS_ORG
set +f

★ORACLE

${ORACLE_HOME}/bin/sqlplus -s / << EOF
WHENEVER SQLERROR EXIT SQL.SQLCODE ROLLBACK;
PROMPT ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
PROMPT DELETE FROM TB_BCMSHY128 WHERE CH_DEMAND_YYYYMM='${demand_yyyy_mm}';
DELETE FROM TB_BCMSHY128 WHERE CH_DEMAND_YYYYMM='${demand_yyyy_mm}';
COMMIT;
exit SQL.SQLCODE
EOF

★ORACLE

#lsは遅いからイラン
target_file_path=$(ls ${filePath})

#-- -pureを設定すること
target_file_path=`find ${DATA_DIR}/work[12]0/output/aplwork[0-9][0-9] -type f -name "IFNBC851_${kuwake_code}.TXT"`

★ORACLE

for kuwake_code in `cat $listFile`
do

★ORACLE

find ${files} -maxdepth 1 -mindepth 1 -type f -print -delete || RET_ALL=1

★ORACLE

# $cmd_fileの中で先頭が$job_idに一致する行を取り出します。
commandline=`awk -F':' '{if($1 == job_id) print $2 }' job_id=$job_id $cmd_file`

#--- 修正1(grep あんま速くならないってか awkのほうが速い)
commandline=`LC_ALL=C grep -e "^${job_id}" $cmd_file`
 
#--- 修正2 あれこっちのが速い
commandline=`LC_ALL=C gawk -F':' -v job_id="${1}" '{if($1 == job_id) print $2 }' $cmd_file`

★ユーザー変えずにコマンド実行するやり方(SQLver)

args=`echo ${CmdString}|sed -e 's/IFNBC[0-9_?A-Z]*.TXT\s//'`
args=`sed <<< ${CmdString} '-e  s/IFNBC[0-9_?A-Z]*.TXT\s//'`

★ORACLE

su - skush101 -c "sqlplus -s / " << EOF
 set termout off
 set lineS 1000
 set pageS 1000
 set colsep,
 set null "@"
 set timing off
 set verify  off
 

 select   ch_demand_mm_and_division,ch_result_cd,count(*)
 from     tb_bctskw037
 where    ch_demand_mm_and_division in ('${t_demand_mm}1','${t_demand_mm}2')
 and      ch_demand_YYYYMM = '${t_demand_YYYYMM}'
 and      ch_latest_state <> '5'
 group by ch_demand_mm_and_division,ch_result_cd
 order by ch_demand_mm_and_division,ch_result_cd;
EOF

★ORACLE

su - oracle
    
    #--- 設定情報表示実行
sqlplus / as sysda << EOF
    
    #--- アーカイブログ確認コマンドの実行
    select name,total_mb,free_mb
    from v$asm_diskgroup
    order by name;
    exit;
EOF

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

#--- エラーがないか確認
cat joblog/*.log | grep -E `(ERROR|error|WARNING|warning)` | more


#改行コードを変換する
nkf ${nkfCode}

#空ファイル一気に作成する
touch $CmdString 

#--ループ
for cIndex in `seq 0 ${#A_infile[@]}`

#★★★ファイル名取得して10バイト目から4バイト取得 0はじまり
kuwake=${file##*/:9:4}

#--- なみはあるけど、カレントディレクトリしか見ないんなら -prune だけのほうが速い
find ${cckfile} -type f -prune -print || RET_ALL=1

#---
kuwake=`basename ${file}
 
#---
LANG=C sed 's/[\x80-\xFF]/●/g' /work/test2.log
send mail to 'aaaa@aaaaa.co.jp' '●●●●●●●●●●●●'

#----
#sqlplus で set コマンド何度も定義したくないから↓で代替できるみたい
local _set_format='set newpage none
                   set feed off
                   set line 1000
                   set trims on'

#---
ls -cl  -c つけると作成日付 通常は更新日付

#----
#からの80byteで分割
fold -b -w 80 IFGBC509.TXT.u8 > IFGBC509_kaigyo.TXT

#---
grep "検索文字列" ~/grep1_S10.txt |wc -l

#---取得出来ない場合
if [ -z "${CmdString}" ]
then

#---環境変数 FACTRY_PATHの設定
for args in $@
do

#---
zgrep "検索文字列" ./*/*.gz | awk -F"/" '{print $2 "," $3 }' | awk -F":" '{print $1}' | uniq -c

#---
perl ${ACSLIB_SH}/IBCZZ000.pl ${outfile_path}.LF  ${outfile_path}

#--- awkの中で$2を返却する際に、ファイル名を置換して返却してくれる
cckfile=`cat ${listFile} | awk -v awkpath="${cckpath}" 'BEGIN{FS=","}{print awkpath"/"$2".cck"}'`

#---
impdp / tables=ORAOWN01.TB_BDMHDK069 dumpfile=TB_BDMHDK069_20170123.dmp table_exists_action=TRUNCATE

# SSH接続 & リモートコマンド実行
exec setsid ssh $SSH_USER@$SSH_HOST $REMOTE_CMD

#--- マッチしたファイル名は件数のみ
matchCount=`bash -c "comm -12 <(cat  ${oldFileList}) <(cat  ${newFileList})" | wc -l`

#---
find ${findPath} -maxdepth 1 ! -name '*.gz'  -type f  | gawk -F/ '{print $NF}' | xargs -I{} bash -c "file_bzip2  {} ${findPath}"

#---"各種内訳"
fold -180 /skdata/data/newdata/target/input/issuer/IFNBC263.TXT | grep -c "^.\{33\}D9"

#--- 指定したテーブルをエクスポートする
su - skush101 -c "expdp / dumpfile=${dmpfile} logfile=${logfile} tables=${tablesF} content=DATA_ONLY"

#--- 16進数で検索
grep -c $'\xeb\xc7' *

#---- 使用ユーザー不明確認
fuser -m /skdata/work20

#--- エラーがないか確認
cat joblog/*.log | grep -E `(ERROR|error|WARNING|warning)` | more

#---
filename=`sed <<< ${out_file} "-e s/{KUWAKE}/${kuwake}/g"`
 
#---
for cIndex in `seq 0 expr ${#FileIN[@]} -1`
do

#---
cat loader/*.LOG | grep '行は' | grep -v ' 0行' | grep -v '成功'

#---
echo ${FileIN[@]}
FileIN=(`echo "$CmdString" | awk 'BEGIN{FS=";"}{print $1}'`)

#---
mo1_file=`awk <<< $args1  'BEGIN{FS="-o "}{print $2}'`

#--- 後述のSSH_ASKPASSで設定したプログラム(本ファイル自身)が返す内容
if [ -n "$PASSWORD" ]; then
  cat <<< "$PASSWORD"
  exit 0
fi

#---
setDateTime=`date "+%Y%m%d%H%M%S"`

#--- 入力チェック(文字数)
if [ ${uName.  } != 8 ]

#---
bash -v -c "ls /home/${uName}"

#---
tail -030 ${loadingFile} | grep IMGBCI194004


#--- 上書き禁止(上書きは -rで実施)
utliupdt -f ${tPath}

#--- glob展開抑止(文字列として判断されなくなる場合が発生する)

★ksarのやり方

こっちがセットアップ用
http://garapon.hatenablog.com/entry/20090323/1237772247

こっちが比較するやり方書いてあるやつ
https://users.miraclelinux.com/support/?q=node/236

ksarの文字化け解消のやり方
http://d.hatena.ne.jp/youhey/20121130/1354259774
★文字を区切るとき
#書き方1
args1=`echo $CmdString | awk 'BEGIN{FS=";"}{print $1}'`
#書き方2(こっちのが速い)
IFS=';' read args1 args2 <<<${CmdString}