お気持ちのみですが、今回急ぎのため合計で1000ポイント程差し上げます。

サーバーサイドで動くプログラム(PHP,Java等)について質問です。
当方、VBA、C等を多少知っていますが、PHP,JAVA等はほとんど知りませんので、下記アルゴリズムに寄らなくても目的を達すれば良いです。

●目的
EXCELがCSVで生成した日報のようなものをマクロでWEBへアップロードすると、サーバーが自動でマスタデータへ統合(単純にマスタCSVデータの末尾へ追加)する。データベースの使用は現在見送っている。

●環境
コメント欄に示す。

●依頼内容
「当該フォルダにCSVファイルがアップロードされると、自動で同フォルダのCSVマスタデータ(MasterTest.csv)の末尾へそのデータを追加する(アップロードされたCSVファイルは消滅して良い)」サーバー用のプログラム群を作り、導入の方法を示して下さい。もし可能なら、上書き完了の是非を示す返り値を返す。

また、この前段階からのプログラムの作成でも結構です(その場合、やはりお気持ちのみですがプラス500ポイント程度)。

アルゴリズムや要件の確認・修正アドバイスがあればお願い致します。

回答の条件
  • 1人3回まで
  • 登録:2009/03/09 13:20:18
  • 終了:2009/03/16 13:25:02

回答(6件)

id:karaki No.1

karaki回答回数17ベストアンサー獲得回数62009/03/09 15:56:17

ポイント19pt

以下、Pythonで作成した例です。

60秒間隔で指定したフォルダのCSVファイルをチェックし、ファイルが2つ以上存在する場合は追加されたと判断し、マスタCSV以外の中身を末尾に追加します。

# coding: utf-8
import os,glob,time
def check():
    #監視フォルダ
    dn = "/var/ftp/usrid"
    #マスタCSV
    mfn = os.path.join(dn,"master.csv")
    #フォルダ内のCSVファイル一覧
    l = glob.glob(os.path.join(dn,"*.csv"))
    #ファイル数が2以上なら追加
    if len(l)>=2:
        fp=open(mfn,"a+")
        for r in l:
            if r==mfn:
                continue
            data = open(r).read()
            fp.write(data)
            os.remove(r)
        fp.close()
if __name__=="__main__":
    while 1:
        check()
        time.sleep(60)

上記内容を、適当なファイル名(例:check.py)として保存します。

そして、

$ python check.py &

などとして、プログラムをバックグラウンドで実行すれば「master.csv」にその他のCSVファイルの内容がそのまま追加されます。


フォルダ内にCSVファイル以外のファイルやフォルダがないことを前提に作成しています。

また、十分な動作検証はしていませんのでご自分で動作の確認をしてください。

(上記スクリプトによって何かあっても責任は持てませんのでよろしくお願いします。)

id:ReoReo7

早速ありがとうございます。

>上記内容を、

ここまで分かりました。

>適当なファイル名(例:check.py)として保存します。

場所はどこにおけば良いでしょうか?サーバー上のcsvが存在するフォルダですか?

>などとして、プログラムをバックグラウンドで実行すれば

この方法が分からないので、教えて頂けませんか?サーバーのバックグラウンドで実行するのでしょうか。

また、CoreServerは1時間以内のcronの実行が許可されていないようですが、上記方法はそれを回避するものでしょうか。尚、更新は1時間でも構いません。

2009/03/09 16:14:42
id:karaki No.2

karaki回答回数17ベストアンサー獲得回数62009/03/09 17:41:22

ポイント19pt

>場所はどこにおけば良いでしょうか?サーバー上のcsvが存在するフォルダですか?

場所はどこでも大丈夫です。ただし、CSVとは別のフォルダにしてください。

※先程書き忘れたのですが、保存する際は「監視フォルダ」と「マスタCSV」を環境に合わせて必ず修正してください。

また、複数のフォルダを監視したい場合はこのスクリプトを複数作成し、「監視フォルダ」と「マスタCSV」の箇所のみ書き換えてください。

>この方法が分からないので、教えて頂けませんか?サーバーのバックグラウンドで実行するのでしょうか。

SSHでログインして、ファイルを保存したフォルダで上記のコマンドを実行します。

>また、CoreServerは1時間以内のcronの実行が許可されていないようですが、上記方法はそれを回避するものでしょうか。尚、更新は1時間でも構いません。

この方法はcronを使うわけではないので、この制限には引っかからないと思います。(もし他にプログラムの実行に関する制限がある場合は確認が必要かもしれません。)


またcronを使用して1時間に1回の実行でよいのであれば、

if __name__=="__main__":
    while 1:
        check()
        time.sleep(60)

を、

if __name__=="__main__":
    check()

に書き換えて、cronに登録してください。(こちらのほうがプログラムの停止の心配が少ないです)

$ crontab -e
0 * * * * python プログラムのフルパス
id:ReoReo7

ありがとうございます。

1:早速サーバー上でCronを登録してみましたが、指定した時間に以下のようなメールがCronのDaemonからメールでレポートされてきて、指定のcsvファイルは統合されていませんでした。何か修正する必要がありますか?

/virtual/・・・/files/cgi/check.py: line 3: syntax error near unexpected token `('

/virtual/・・・/files/cgi/check.py: line 3: `def check():

'

尚、レポートの全文はコメント欄に示しました。

2:

if __name__=="__main__":

while 1:

check()

time.sleep(60)

のプログラムの実行回数を60回(あるいはそれ以下)として、

1時間ごとにcronを利用して再実行、ということで

「毎分実行、万が一停止してしまっても少なくとも1時間に1回」

実行する、というプログラムにすることはできませんでしょうか?

また、できる場合、プログラムを示して頂けませんでしょうか。

よろしくお願い致します。

2009/03/09 23:19:30
id:PanicMeo No.3

PanicMeo回答回数6ベストアンサー獲得回数02009/03/10 09:58:37

ポイント18pt

シェルスクリプトでも可能な気がします。手順は以下の通りです。

1. サーバー上にcheck.shという名前で以下の内容のファイルを作ります。


/home/yourid/の部分はサーバのホームディレクトリなどに書き換えてください。


#!/bin/bash


WORKDIR=/home/yourid/data # 監視ディレクトリ

BACKDIR=/home/yourid/back # 処理済ファイル保管場所

LOGFILE=/home/yourid/log.txt # 処理結果ログファイル名


INPUT=*.csv

OUTPUT=MasterTest.csv


cd $WORKDIR


find $INPUT \! -name $OUTPUT -exec cat {} >> $OUTPUT \; 2>/dev/null

find $INPUT \! -name $OUTPUT -exec echo `date` {} "を処理しました" >> $LOGFILE \; 2>/dev/null


find $INPUT \! -name $OUTPUT -exec mv {} $BACKDIR \; 2>/dev/null

## find $INPUT \! -name $OUTPUT -exec rm {} \; 2>/dev/null


2. SSHでログインして実行権限をつける


$ chmod +x check.sh


3. dataディレクトリとbackディレクトリを作る


$ mkdir data

$ mkdir back


4. 手動で実験してOKならCRONに登録する


$ ./check.sh


log.txtに処理結果が記録されます。

一応末尾に追加するファイルをbackディレクトリに移動して保存していますが、不要でしたらcheck.shの末尾部分を


## find $INPUT \! -name $OUTPUT -exec mv {} $BACKDIR \; 2>/dev/null

find $INPUT \! -name $OUTPUT -exec rm {} \; 2>/dev/null


このように変更してください。

id:ReoReo7

ありがとうございます。

大変恐縮なのですが、できれば、SSHでのログインは避けたいと思います。

上記プログラムのうち、SSHでのログイン&実行は、確認のためだけでしょうか?(CRONに登録するだけでも大丈夫ですか?)

その理由は

1:SSHでログインの方法が良く分かっていない

2:調べたところ、使用しようとしているXreaサーバーは、SSHでのログインについて、慣れた人でも設定が面倒

3:これから複数のXreaサーバーで同様のことを試みる予定がある

このため、SSHログインの必要が無い環境での実行がもっとも望ましいと考えるようになりました。

お手数ですが、SSHログインが必要な場合は、Phthon+Cronの実行等でも結構ですし、そうでなくとも結構です。他にもし方法があれば教えて下さいませんでしょうか。上記方法は早速今から試してみます。

2009/03/10 10:20:42
id:PanicMeo No.4

PanicMeo回答回数6ベストアンサー獲得回数02009/03/10 15:21:15

ポイント18pt

なるほどSSHは避けたいのですね。

>上記プログラムのうち、SSHでのログイン&実行は、確認のためだけでしょうか?

SSH以外で、ディレクトリを作ることが可能であれば特にSSHである必要はありません。

シェルスクリプトは check.shをcronに設定するだけでも動作すると思います。

id:ReoReo7

ありがとうございます。無事設定できましたが、CRONで設定した時間になるとエラーレポートがメールで送られてきました。

/virtual/・・・/files/cgi/check.sh: line 7: cd: /virtual/・・・/files/csv/tts1

: No such file or directory

/virtual/・・・/files/cgi/check.sh: line 8: /dev/null

: Permission denied

/virtual/・・・/files/cgi/check.sh: line 9: /dev/null

: Permission denied

/virtual/・・・m/files/cgi/check.sh: line 10: /dev/null

: Permission denied

・・・は省略しています。「/virtual/・・・/files/csv/tts1」フォルダはちゃんとありますし、その中にmaster.csvファイル、up.csvファイル、backとlogフォルダもちゃんと作ったのですが・・・原因は推測できますでしょうか?

2009/03/10 16:08:25
id:PanicMeo No.5

PanicMeo回答回数6ベストアンサー獲得回数02009/03/10 16:32:53

ポイント18pt

以下の二つを試してみてください

・check.shの 2>/dev/null という文字列を全部削除する。

・「/virtual/・・・/files/csv/tts1」フォルダのパーミッションをグループ・その他とも実行・読み込み・書き込みを出来るようにする

パーミッションの変更については、CORESERVERのファイルマネージャ(?)のヘルプを参照してみてください。

もし、FFFTPを使用しているのであれば

FFFTP パーミッション設定方法

こちらを参考にしてみてください。

id:ReoReo7

ありがとうございます。

FFFTPでしたので、パーミッションの変更が完了できました。

・check.shの 2>/dev/null という文字列を全部削除する。

>実行しました。

・「/virtual/・・・/files/csv/tts1」フォルダのパーミッションをグループ・その他とも実行・読み込み・書き込みを出来るようにする

>「/virtual/・・・/files/csv/tts1/master.csv」などのパーミッションは変更する必要は無いのでしょうか。

これで設定が完了したので、30分後のCRONで動作が確認できそうです。


追記

結果:以下エラーでした。

/virtual/・・・/files/cgi/check.sh: line 7: cd: /virtual/・・・/files/csv/tts1

: No such file or directory

find: missing argument to `-exec'

find: missing argument to `-exec'

find: missing argument to `-exec'

2009/03/10 18:32:58
id:Mook No.6

Mook回答回数1312ベストアンサー獲得回数3912009/03/12 02:15:18

ポイント18pt

これまで回答されたものとは全く異なるアプローチですが、もしウェブサーバを利用できる環境であれば、

WEB を使用した更新というのもありかと思います。


下記はファイルをウェブ画面よりアップロードし、その際にマスタファイルに追記しています。

アップロードしたファイルは指定フォルダに蓄積されていき、当日アップロードされたものが画面上に

リストされるようにしています。


Webサーバの CGIフォルダ(cgi-bin 等)に下記をupload.cgi 等で保存し、ブラウザで

http://サーバ名/cgi-bin/upload.cgi

のようにしてアクセスします。


コードは下記をベースに、カスタマイズしています。

http://nais.to/~yto/tools/ssupload/

詳細の設定方法は、お使いのサーバでご確認ください。

#!/usr/bin/env perl
use strict;
use CGI;
use CGI::Carp qw(fatalsToBrowser);
use POSIX qw(strftime);
use File::Spec;

my $q = new CGI;

print $q->header(-charset => 'Shift-JIS'), $q->start_html();

#----------------------------------------------------------------
# ★★★実際のファイルパスに変更
#----------------------------------------------------------------
my $outputdir = "/home/database/log";               # ファイルを置く先 (ディレクトリ)
my $masterCsv = "/home/database/masterTest.csv";    # アップロードしたファイルを追加先ファイル


my $fh = $q->param('uploaded_file');
my ($mvolume,$mdirectories,$mfile) = File::Spec->splitpath( $masterCsv );

if ($fh ne "") {
    my $timestamp = strftime "%y%m%d%H%M%S", localtime;
    my ($avolume,$adirectories,$afile) = File::Spec->splitpath( $fh );
    my $outputfn = "$outputdir/${timestamp}_$afile";

    open( IF, "> $outputfn") or die;
    open( AF, " >> $masterCsv" ) or die;

    flock(F, 2);
    if (defined $fh) {
        while (<$fh>) {
            print F $_;
            print AF $_;
        }
    }
    close F;
    close AF;
    print qq{<a href="$outputfn">$afile</a> を $mfile に追記しました。};
}

$q->delete_all();

print qq(<p><a href="@{[$q->self_url]}">RELOAD</a></p>);

print $q->start_multipart_form(-name => 'myform'),
    "FILE ", $q->filefield(-name => 'uploaded_file'), $q->submit("OK"),
    $q->endform;
my $today = strftime "%y%m%d", localtime;
my @fl = reverse <$outputdir/${today}*>;
my @fll = map { my ($avolume,$adirectories,$afile) = File::Spec->splitpath( $_ ); $afile } @fl;
print "<ul>", (map {qq(<li><a href="$_" target="_blank">$_</a> )} @fll), "</ul>";

print $q->end_html(), "\n";

実行画面

f:id:Mook:20090312020728j:image



ただ、これはだれでもアクセスできてしまうので、インタネット上で運用する場合は、Basic 認証等で

アクセスを制限したほうがよいでしょう。

http://allabout.co.jp/internet/hpcreate/closeup/CU20020910A/

id:ReoReo7

いつも、ありがとうございます。

先ほど試してみたところ、無事アップロード&統合ができました。

さて、ファイルのアップロード&統合はVBAアプリケーション(ユーザーフォーム)からボタン一つで自動化したいのですが、その方法がありましたら教えて頂くことはできませんでしょうか?

上記で教えて頂いたWEBアップロードによる方法以外、まだ実現できておらず、困っています。

もしよろしければ、そちらのほうもご教授頂ければ幸いです。

2009/03/13 11:17:27
  • id:ReoReo7
    ●環境
    ユーザー・・・1部署~、各部署100名前後~想定、各部署のデータは独立かつ、部署ごとに独立して保管されるパスワードは機密。
    サーバー・・・CORESERVER http://www.coreserver.jp/ 部署ごとにフォルダを分割。各フォルダに部署マスタCSVデータが1つ。
    セキュリティー・・・サーバーへアップロードされる/サーバーが扱うCSVファイルは全て暗号化されたものである。データ消失リスクはバックアップにより回避される予定。CSVデータが無意味に加えられる可能性は考慮しない。
    ※ファイルは漏洩しても問題ない。
    ※イタズラにより巨大で無意味なデータがアップロードされるのを回避するため、将来的にはBASIC認証+SSLを加える予定。
    アップロード方法・・・VBAからFTPPutFileコマンドを用いる。
    FTPPutFile http://www.happy2-island.com/access/gogo03/capter90302.shtml
    この際何か"追加データです"という意味を持つ文字列を一緒にキューとして送信しても良い。
  • id:ReoReo7
    「上書き完了の是非を示す返り値を返す」ですが、VBAのマクロへの返り値は「アップロード完了の是非」なので、少し意味の分からない要求になってしまいました。

    「上書きが完了したらアップされたCSVファイルを消去し、上書きできなければ消去しない」などでも構いません。

    当面は、サーバーにアップされたデータが何らかの形で保持されていれば(サーバープログラムが勝手に消去しなければ)良いです。
  • id:ReoReo7
    データの同期性ですが、理想的に1分以内であれば良いです。

    「1分おきにサーバーフォルダを確認し、新しくCSVファイルがアップされていれば、順にマスタデータへ統合する」などで構いません。
  • id:tezcello
    FTP でアップロードした事をトリガにして...というのは難しそうです。
    実行できるコマンドとして、シェルスクリプト等(シェル以外にも perl, PHP など)でご希望の動作を仕込んだものを置いておくのはいかがでしょう?
    ただし、FTP からそれらが実行できるのかは確かめていません。(特定コマンドしか実行できないかも知れません)

    FTP ではなく、アップロードすべき一時ファイルを作っておき、ブラウザで特定ページにアクセスし、一時ファイルをアップロードするのはどうでしょう?
    マクロから、ブラウザを開いて特定ページにアクセスできるのか疑問ですが、ローカルのファイルをアプロードするフォームを作る事は難しくないので、これを受け取る側にご希望の処理をするようなスクリプトを組むだけです。(例は、それこそ山ほど転がっていますよね)


    「定期的に実行する」というのは、通常は cron を使うのでしょうけど、coreserver は1時間以内の設定はNGの様ですね。


  • id:esecua
    >EXCELがCSVで生成した日報のようなものをマクロでWEBへアップロードすると、サーバーが自動でマスタデータへ統合(単純にマスタCSVデータの末尾へ追加)する。データベースの使用は現在見送っている。

    各店からの日報を集中的に処理するシステム化なんかですか?
    これは明らかにブラウザ越しに入力させ、データベースに保存管理が最も良い方法かと。
  • id:ReoReo7
    「部署ごとに独立して保管されるパスワード」とは、復号(デコード)パスワードのことです。
  • id:ReoReo7
    >tezcelloさん

    ありがとうございます。

    >マクロから、ブラウザを開いて特定ページにアクセスできるのか疑問ですが、ローカルのファイルをアプロードするフォームを作る事は難しくないので、これを受け取る側にご希望の処理をするようなスクリプトを組むだけです。(例は、それこそ山ほど転がっていますよね)

    アップロードを含めて、全て自動化できるならばそれで構いませんが、ユーザーにファイルを選ばせるようなことはせず、クライアントアプリケーションの終了ボタンを押した際に全て自動で行いたいです。

    >「定期的に実行する」というのは、通常は cron を使うのでしょうけど、coreserver は1時間以内の設定はNGの様ですね。

    1分というのは理想なので、1時間の処理で問題ありません。これでいけるならば、いきたいと思います。
  • id:ReoReo7
    >esucuaさん

    ありがとうございます。

    >各店からの日報を集中的に処理するシステム化なんかですか?
    正確には日報ではなく、また入力補助や検索のアルゴリズムが複雑なため、現在クライアントでしかデータを生成できません。
  • id:fut573
    CORESERVERはxrea系でphpはセーフモード、メモリ制限は80Mであることは明記しておいた方がいいと思います。
    これはちょっと特殊な仕様で、一部のスクリプトが動かない可能性があります。

    >ユーザー・・・1部署~、各部署100名前後
    とありますが、その数のユーザーが毎日日報を送信するとしたら、マスターcsvはすぐに肥大化します。
    サーバー負荷を考えると、データベースを導入すべきだと思います。

  • id:ReoReo7
    >fut573さん

    >CORESERVERはxrea系でphpはセーフモード、メモリ制限は80Mであることは明記しておいた方がいいと思います。これはちょっと特殊な仕様で、一部のスクリプトが動かない可能性があります。

    ありがとうございます。セーフモード、メモリ制限という言葉を初めて知りました。

    >ユーザー・・・1部署~、各部署100名前後
    とありますが、その数のユーザーが毎日日報を送信するとしたら、マスターcsvはすぐに肥大化します。
    サーバー負荷を考えると、データベースを導入すべきだと思います。

    ありがとうございます。現在10名前後で試用版のため、フィールドも確定していないため、CSV形式で運用しています。いずれはデータベースを導入する予定です。
  • id:ReoReo7
    以下、Phthonプログラムに関するメールレポートの全文です。
    **
    Version: ImageMagick 6.2.9 09/09/06 Q16 http://www.imagemagick.org
    Copyright: Copyright (C) 1999-2006 ImageMagick Studio LLC

    Usage: import [options ...] [ file ]

    Where options include:
    -adjoin join images into a single multi-image file
    -annotate geometry text
    annotate the image with text
    -border include image borders in the output image
    -channel type apply option to select image channels
    -colors value preferred number of colors in the image
    -colorspace type alternate image colorspace
    -comment string annotate image with comment
    -compress type type of pixel compression when writing the image
    -crop geometry preferred size and location of the cropped image
    -debug events display copious debugging information
    -define format:option
    define one or more image format options
    -delay value display the next image after pausing
    -density geometry horizontal and vertical density of the image
    -depth value image depth
    -descend obtain image by descending window hierarchy
    -display server X server to contact
    -dispose method GIF disposal method
    -dither apply Floyd/Steinberg error diffusion to image
    -encoding type text encoding type
    -endian type endianness (MSB or LSB) of the image
    -format "string" output formatted image characteristics
    -frame include window manager frame
    -geometry geometry perferred size or location of the image
    -gravity direction which direction to gravitate towards
    -help print program options
    -identify identify the format and characteristics of the image
    -interlace type None, Line, Plane, or Partition
    -interpolate method pixel color interpolation method
    -label name assign a label to an image
    -limit type value Area, Disk, Map, or Memory resource limit
    -log format format of debugging information
    -monitor monitor progress
    -monochrome transform image to black and white
    -negate replace every pixel with its complementary color
    -page geometry size and location of an image canvas
    -pause value seconds delay between snapshots
    -pointsize value font point size
    -quality value JPEG/MIFF/PNG compression level
    -quantize colorspace reduce colors in this colorspace
    -quiet suppress all error or warning messages
    -regard-warnings pay attention to warning messages
    -repage geometry size and location of an image canvas
    -resize geometry resize the image
    -rotate degrees apply Paeth rotation to the image
    -sampling-factor geometry
    horizontal and vertical sampling factor
    -scene value image scene number
    -screen select image from root window
    -set attribute value set an image attribute
    -silent operate silently, i.e. don't ring any bells
    -snaps value number of screen snapshots
    -strip strip image of all profiles and comments
    -support factor resize support: > 1.0 is blurry, < 1.0 is sharp
    -thumbnail geometry create a thumbnail of the image
    -transparent color make this color transparent within the image
    -transparent-color color
    transparent color
    -treedepth value color tree depth
    -trim trim image edges
    -type type image type
    -verbose print detailed information about the image
    -version print version information
    -virtual-pixel method
    Constant, Edge, Mirror, or Tile
    -window id select window with this id or name

    By default, 'file' is written in the MIFF image format. To
    specify a particular image format, precede the filename with an image
    format name and a colon (i.e. ps:image) or specify the image type as
    the filename suffix (i.e. image.ps). Specify 'file' as '-' for
    standard input or output.
    (以下、エラー文。)
  • id:PanicMeo
    回答3回越えましたのでコメントで書きます

    >/virtual/・・・/files/cgi/check.sh: line 7: cd: /virtual/・・・/files/csv/tts1
    >: No such file or directory

    コレに関しては、ディレクトリの指定が間違っていないか再度確認してみてください

    >find: missing argument to `-exec'
    >find: missing argument to `-exec'
    >find: missing argument to `-exec'

    おそらく「2>/dev/null」という文字と共に「\;」の部分も削ってしまっています。
    「{}」の後ろに一文字以上の空白をあけて「\;」をつけるようにしてください。
  • id:ReoReo7
    >PanicMeoさん

    ありがとうございます。

    >/virtual/・・・/files/cgi/check.sh: line 7: cd: /virtual/・・・/files/csv/tts1
    >: No such file or directory

    おかしいですね・・・フォルダは確かに作ったはずです。
    新しく作ったフォルダ内に置いたcheck.shが動いているので、大丈夫なはずなのですが。
    相対パスで指定してみようかとも思うのですが方法が分かりません。

    >cd $WORKDIR
    >find $INPUT \! -name $OUTPUT -exec cat {} >> $OUTPUT \;
    >find $INPUT \! -name $OUTPUT -exec echo `date` {} "を処理しました" >> $LOGFILE \;
    >find $INPUT \! -name $OUTPUT -exec mv {} $BACKDIR \;
    >## find $INPUT \! -name $OUTPUT -exec rm {} \;
    となっています。最初の一行目にも\;が要りますか?
  • id:PanicMeo

    >/virtual/・・・/files/cgi/check.sh: line 7: cd: /virtual/・・・/files/csv/tts1
    >: No such file or directory

    /virtual/・・・/files/csvフォルダと
    /virtual/・・・/filesフォルダにも、読み・書き・実行属性を与えてみてください。


    >find $INPUT \! -name $OUTPUT -exec cat {} >> $OUTPUT \;
    >find $INPUT \! -name $OUTPUT -exec echo `date` {} "を処理しました" >> $LOGFILE \;
    >find $INPUT \! -name $OUTPUT -exec mv {} $BACKDIR \;

    いやいやいや

    「{}」の後ろに一文字以上の空白をあけて「\;」をつけるようにしてください。

    一番後ろではないです。
  • id:ReoReo7
    >PanicMeoさん

    ありがとうございます。

    >/virtual/・・・/files/csvフォルダと
    >/virtual/・・・/filesフォルダにも、読み・書き・実行属性を与えてみてください。

    分かりました。

    >find $INPUT \! -name $OUTPUT -exec cat {} \; >> $OUTPUT
    >find $INPUT \! -name $OUTPUT -exec echo `date` {} \; "を処理しました" >> $LOGFILE
    >find $INPUT \! -name $OUTPUT -exec mv {} \; $BACKDIR

    こういうことでよろしいでしょうか?
  • id:PanicMeo
    あぁ、ごめんなさい。ちょっと説明が間違ってました

    >>
    find $INPUT \! -name $OUTPUT -exec cat {} \; >> $OUTPUT
    find $INPUT \! -name $OUTPUT -exec echo `date` {} "を処理しました" \; >> $LOGFILE
    find $INPUT \! -name $OUTPUT -exec mv {} $BACKDIR \;
    <<

    こういうことです

  • id:ReoReo7
    PanicMeoさん

    お世話になっております。

    コメントありがとうございます。
    いろいろと自分でもいじってみましたが、何とかファイルの実行まで実現できました。

    ありがとうございます。

    ※あとは、BACKDIRへのファイルの移動がうまくいかないようです(ファイルが生成できません)。
    現在はこちらの対処をしているところです。
  • id:Mook
    送る側はVBA でということですが、FTP で送ることを考えていますか?
    VBA から FTP で送るには、コマンドで送るか BASP21 のようなライブラリを
    使用する方法があります。

    コマンドでやるのであれば、下記のようなテキストを作成しておきこれをVBAから
    Shell で実行すればできそうです。
    http://www.ponko2.com/ftp_bat.html
    ftp でファイルを送るのは、上記のサンプルで get でなくput を使用します。


    蛇足ですが、PanicMeoさんのやっていることと同じですが、下記のように
    書くこともできます。
    1回の find で纏めても同じですが、いずれにせよ一度のリスト処理で実行した
    ほうが見やすい(管理しやすい)でしょう。
    こちらのテストでは、これで移動していますがしませんか(PanicMeo さんのでも
    問題ないと思いますが)?
    -------------------------------------------------------
    #!/bin/bash
    WORKDIR=/home/yourid/work # 監視ディレクトリ
    BACKDIR=/home/yourid/back # 処理済ファイル保管場所
    LOGFILE=/home/yourid/log.txt # 処理結果ログファイル名
    OUTFILE=/home/yourid/MasterTest.csv

    for file in `ls $WORKDIR/*.csv`
    do
      cat $file>>$OUTFILE
      echo `date` : $file ' を追記しました' >>$LOGFILE
      mv $file $BACKDIR
    done
    -------------------------------------------------------
    インデントのためにスペースを全角にしています。
  • id:ReoReo7
    みなさま、いろいろとご教授頂きまして、ありがとうございました。

    最後の問題の解決を図ってきましたが、問題解決の前に質問が自動終了となってしまい、ポイントが通常の配分となってしまいました。問題解決の際は1000ポイント差し上げるということでしたが、まだ私の知識不足のために解決に至っていないために、質問を終了してポイント配分ということになりませんでした。ここまでのポイントを心ばかりですが差し上げたいのですが、大変失礼ながら、ポイントの移動の方法が分からないので、次回ご回答頂くことがあればその際に還元させて頂きたいと思います。

    おかげさまで、ファイルの自動生成までできました。

    最後のMookさんのコメントに従い、最終的にファイルをバックアップするまでのプログラムの作成を試みています。
  • id:ReoReo7
    >Mookさん

    ありがとうございます。

    >送る側はVBA でということですが、FTP で送ることを考えていますか?
    >VBA から FTP で送るには、コマンドで送るか BASP21 のようなライブラリを使用する方法があります。

    VBAからFTPで送ることを考えています。

    >コマンドでやるのであれば、下記のようなテキストを作成しておきこれをVBAからShell で実行すればできそうです。
    >http://www.ponko2.com/ftp_bat.html
    >ftp でファイルを送るのは、上記のサンプルで get でなくput を使用します。

    コマンドとBASP21のようなライブラリの違いが分かりませんが、コマンドでやる方がよさそうなので、そちらを利用したいと思います。

    現在、他の箇所の修正に時間を取られており、改善することができません。しかし、ご提示頂きましたプログラムは、後ほど参考にさせて頂き、プログラムの完成にこぎつけたいと思います。ありがとうございます。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません