web-dev-qa-db-ja.com

csvファイルにレコードを追加するバッチスクリプト

トレーディング戦略をバックテストしているcsvの株式データがたくさんあります。問題は、昨日シグナルが見つかった場合、私の戦略が公開市場価格を購入することです。残念ながら、私のデータは1日の終わりにのみリリースされるため、市場が終了するまで取引に参加することになっていたかどうかはわかりません。データが公開されます。しかし、私の戦略は昨日のデータのみで取引しているので、回避策は、次の取引日を表すデータの最後にレコードを追加し、利益の損失を台無しにしないように、昨日の価格を終始終わらせることです。たとえば、私のcsvの1つが次のようになっているとします(この形式ではありませんが、実際のファイルにはヘッダーがなく、コンマで区切られています)

Date     |   Open  |   High  |   Low   |   Close  |  Volume  |
20121228 |  12.23  |  12.80  |  12.23  |   12.60  |  129690  |
20121231 |  13.16  |  13.20  |  12.83  |   13.10  |  141290  |
20130102 |  13.03  |  13.42  |  12.97  |   13.23  |  112390  |
20130103 |  13.23  |  13.80  |  12.23  |   12.60  |  100990  |
20130104 |  12.83  |  12.84  |  12.23  |   12.40  |   89690  |

次のレコードを追加したいと思います。

20130105 |  12.40  |  12.40  |  12.40  |   12.40  |   89690  |

したがって、日付1をインクリメントしてから、前の値を他の価格設定フィールドの近くにコピーする必要があります。ボリュームを同じに保つのが最善だと思います。これは、すべてのファイルにダミーフィールドを追加するためにフォルダーを毎日ループするため、よりタイムリーにシグナルを取得できます。そして、毎日の終わりに、別のバッチファイルがあり、データフォルダーをクリアして、実際の価格データで上書きするようになっています。

3
Brandon Ogle

これはあなたが思っていたよりも簡単かもしれませんし、私はあなたの必要性を単純化しすぎたかもしれませんが、CSVファイルを既存のファイルに追加したいのであなたの質問を読みました。Windowsとほとんどのコマンドシェルシステムでは、コマンドは次のようになります。

タイプUNIX、LINUX、OSXではcat[〜#〜] newcsvfilename [〜#〜] >> [〜#〜]既存のcsvファイル[〜#〜]

それはコマンドですが、このデータにもお金を払っているので、それを尊重する必要があるため、必要な方法論がたくさんあります。トレーダーとして、PCデータをバックアップする方法はすでにありますが、オリジナルを保持することをお勧めします。そのため、ほとんどのWindows PCでバッチファイルの形式で、バッチファイルとして保存されたこの一連のコマンドを試してください。

@echo off

title =価格設定データアペンダーが%date%に%time%で%username%によって実行されました

コピー[〜#〜]既存のcsvfile [〜#〜]EXISTINGCSVFILE。%date%_bak && attrib + r EXISTINGCSVFILE。%date%_bak

タイプUNIX、LINUX、OSXではcat[〜#〜] newcsvfilename [〜#〜] >> ** EXISTINGCSVFILE *

title = Pricing Data Appender COMPLETED on%date%at%time%by%username%

そして、それは編集する前に既存の価格設定データベースのバックアップコピーを作成し、マイナーな保護手段として、少なくとも最悪の状況ではファイルを削除してはならないことを警告し、シェルやさまざまなユーティリティから保護するようにReadOnly属性に設定します削除から。

SarBoxまたは小規模なブティックトレーダーを苦しめるその他の規制の対象となっている場合、SarbaneOxley Section 404およびDodd-Frank法で要求されているように、プロセスのシステムイベントログに独立したエントリを記録する他のコマンドがいくつかあります。義務条項の分離。

私はもっ​​と助けたいと思っているので、これを詳しく説明したり、テストして確認/デバッグしたい場合は、今日が私に知らせる良い日です。

1
user189950

C++に精通している場合は、おそらくいくつかのC#を処理できます。

エラーチェックはありません。バックアップを取らずにcsvファイルを変更します。また、csvファイルが大きい場合は(ファイル全体をメモリに読み込むため)特に効率的ではありませんが、一般的な考え方はわかります。

Windows 7を使用している場合は、すでにdotnet Frameworkを使用しているはずなので、これをファイルにコピーし、csc filename.csを使用してコマンドラインからコンパイルすると、filename.exeが生成されます。

using System.Collections.Generic;
using System;
using System.Linq;

public class Sample
{

    public static void Main()
    {
        string path = @"c:\temp\temp.csv";

        var lines     = System.IO.File.ReadAllLines(path).ToList();
        var lastLine = lines[lines.Count-1];
        var sections = lastLine.Split(new char[] { ','});

        DateTime lastDate = DateTime.ParseExact(sections[0], "yyyyMMdd" , null );
        DateTime newDate  = lastDate.AddDays(1);
        string newLine    = String.Format("{0},{1},{1},{1},{1},{2}", 
                    newDate.ToString("yyyyMMdd"), sections[4] , sections[5]);
        lines.Add(newLine);

        System.IO.File.WriteAllLines(path, lines.ToArray());

    }

}

ただし、少し編集する必要があるので、ダウンロードすることをお勧めします LinqPad そしてmainメソッドをコピーして(そしてC#プログラムを選択して)実行を押してコンパイルして実行する必要があります。

0
sgmoore

Data.csvに含まれる場合:

20121228,12.23,12.80,12.23,12.60,129690
20121231,13.16,13.20,12.83,13.10,141290
20130102,13.03,13.42,12.97,13.23,112390
20130103,13.23,13.80,12.23,12.60,100990
20130104,12.83,12.84,12.23,12.40,89690

スクリプトを実行するたびに、次の行を追加します。

20130117,12.40,12.40,12.40,12.40,89690

(つまり、 "現在の日付(YYYYMMDD)、前のクローズ、前のクローズ、前のクローズ、前のクローズ、前のボリューム")

pdate.batとして保存されているこのようなものを試してください:

@echo off
for /f "usebackq tokens=1,5,6 delims=," %%i in (Data.csv) do (
    REM set /a date=%%i+1 // Wrong way to increment a date!
    set close=%%j
    set volume=%%k
)
echo %date:~6%%date:~3,2%%date:~0,2%,%close%,%close%,%close%,%close%,%volume%>>Data.csv

ディレクトリ内の複数のCSVでこれを実行する場合は、上記のData.csvの両方のインスタンスを%1に置き換えます。ここで、単一のファイル、つまりData.csvを更新するには、次のコマンドを使用します。

update Data.csv

複数のCSVを更新するには、次のコマンドを使用します。

for %f in (*.csv) do @update "%f"

注#1:正確な日付形式は、地域と言語コントロールパネルアプレットで指定した内容によって異なります。詳細については、 ここ を参照してください。

注2:日付の増分と検証ロジック(うるう年の計算などを含む)couldもバッチで実装されると思います(ええ、おそらく銃が私の頭に向けられていたら!)、しかしその時点で私は質問者の正気を疑うようになり(自分自身を疑う以外に)そして真剣により良いことを示唆する(actualを読んでください)これを達成するためにプログラミング言語を使用します。

0
Karan

Windows 7を実行している場合(質問タグはそれを示唆しています)、PowerShellを使用するとはるかに簡単に実現できます。 Import-CsvおよびExport-Csvコマンドを見てみてください(後者には非常に役立つパラメーター-Appendがあります。

必要に応じて、コマンドのドキュメントをご覧ください。

Import-Csv: https://technet.Microsoft.com/en-us/library/ee176874.aspx

エクスポート-Csv: https://technet.Microsoft.com/pt-br/library/ee176825.aspx

これは次のようになります。

$Path = "C:\PathToFile"
$Objects = Import-Csv $Path
# Here $Objects will be an array of objects, which you can access its 
# properties by the same name in the header of your csv
# you can then do whatever you want in the list:
foreach ($Object in $Objects){
    $Object.Date = $SomeDate
}
# or you can add a new object to the list
$NewObject = [pscustomobject]@{
     Date = Get-Date;
     Open = "12.58";
}
$Objects += $NewObject
# and then finally save it with:
$Objects | Export-csv $Path -Force -NoTypeInformation
# Alternatively, you can add just the object at the end with append, like this
$NewObject | Export-Csv $Path -Append
0
Hellon