csvの結合で、お尋ねします。No.05756
yamasan さん 08/02/05 15:33
 
こんにちは。ご相談を申し上げます。よろしくお願いします。

csvファイルを結合したいのですが、
単純に、結合するのではなくて、以下のような事を考えております。
お力をお貸し下さい。

csvファイルの内容は、出席者名簿でして、

Text1,Text2,Text3,Text4,Text5,Text6,Text7,Text8,Text9

Text1:"1"〜"99999" (一桁〜五桁の会員番号)
Text2:"0"もしくは"1"
Text3:"1"〜"99" (一桁〜二桁の半角数字)
Text4:"00001"〜"99999" (五桁の半角数字)
Text5:"0"もしくは"1"
Text6:"0"もしくは"1"
Text7:"1"〜"99999" (一桁〜五桁の半角数字)
Text8:全角文字 (全角4〜9文字)
Text9:半角カタカナ (氏名のふりがな)

となっています。
一つのファイル内は、50〜1000行程度。
(最大でも、2000行を超える事はないです。)
先頭行は、項目名などでなく、一行目から、この仕様です。

そして、ファイル名が、
"20071208020300午後集会名03.csv"
というような形です。20071208020300の後ろは、"午後"もしくは"午前"です。
("集会名"の文字数は、任意です。)
ファイル名の最後は、"01"から"99"が入っています。

一つのフォルダに、10〜30個程度のcsvファイルがあります。

フォルダの中の*.csvを全て結合したいんですが、
バッチファイルを作るのではなく、秀丸で処理できないかと思い、
ご相談しています。

ファイル名の最初の200712080203を最初に、集会名を2番目に、
Text1を3番目、Text8を4番目、Text9を5番目に持ってきたいのです。

各ファイルのファイル名から、
そのファイルに付け加えた上で、変更後、結合したいのです。

上記ファイルですと、変更後は、
200712080203,集会名,Text1,Text8,Text9
です。

大変厚かましい事で、恐縮ではございますが、
どうか、お願い申し上げたいのですが、よろしくお願いします。

[ ]
RE:05756 csvの結合で、お尋ねします。No.05757
yamasan さん 08/02/05 16:07
 
スイマセン、間違いました。

>上記ファイルですと、変更後は、
>200712080203,集会名,Text1,Text8,Text9

変更後は、
200712080203,集会名,Text1,Text8,Text9
に、もう一項目最後に、必要なんです。
ごめんなさい。

200712080203,集会名,Text1,Text8,Text9,ファイル名の最後の半角英数字
です。どうか、よろしくお願いします。

[ ]
RE:05757 csvの結合で、お尋ねします。No.05758
yamasan さん 08/02/05 16:21
 
度々、失礼します。

フォルダ名は、固定した方が、
簡単かも知れないと考えますので、

c:\_csv\*.csv
と言う事で、お願いしたいと思います。

本当にスイマセンが、ご教授下さい。
お願い申し上げます。

[ ]
RE:05757 csvの結合で、お尋ねします。No.05759
IKKI さん 08/02/05 23:02
 
IKKI です。こんばんは。

> バッチファイルを作るのではなく、秀丸で処理できないかと

こういった大量のテキスト処理はエディタが不得手とするところであり、
スクリプト(バッチファイルのようなもの)で行うのが正道だと思います。

どうしても秀丸を使わざるをえないのであれば、こんなマクロでできそうです。


// 対象フォルダ内にあるファイルのいずれかを開いた状態で実行
grep "^", "*.csv", ".", regular, filelist;
if (result <= 0) endmacro;
while (lineno < linecount) {
 $$name = gettext2(0, lineno, linelen2 - 3, lineno);
 $$name1 = gettext2(0, lineno, 12, lineno);
 $$name2 = gettext2(18, lineno, linelen2 - 9, lineno);
 $$name3 = gettext2(linelen2 - 9, lineno, linelen2 - 7, lineno);
 deleteline;
 ##line1 = lineno;
 insertfile $$name;
 ##line2 = lineno;
 beginsel;
 movetolineno 1, ##line1;
 replaceallfast "^(.*?),(.*?),(.*?),(.*?),(.*?),(.*?),(.*?),(.*?),(.*?)$", $
$name1 + "," + $$name2 + ",\\1,\\8,\\9," + $$name3, regular, inselect;
 escapeinselect;
 movetolineno 1, ##line2;
}

[ ]
RE:05759 csvの結合で、お尋ねします。No.05760
yamasan さん 08/02/06 09:54
 
IKKI様、おはようございます。ありがとうございます。

お陰様で、希望した事が可能になりました。
勉強不足で、困った時は、このフォーラムへ丸投げで、
いつも反省していますが、ご容赦下さい。お願いします。

解決しました〜。ありがとうございました。
お教えいただいたマクロを、
"all-csv.mac"として、使わせていただきます。

それで、このマクロ結果の、
先頭行に"日付,集会名,会員番号,所属,氏名フリガナ,単位"
を付け加えて、ファイル名を"平成19年度"にする場合は、

all-csv.macの最後に、

 setcompatiblemode 0x0F;
 gofiletop;
 insertreturn;
 up;
 insert "日付,集会名,会員番号,所属,氏名フリガナ,単位";
 saveas "平成19年度.txt"

と付け加えたら、上手く動作しているようですが、
問題ないでしょうか?

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
「フォルダ内のcsvファイルを一括で結合する方法」として、
"batファイル csv 結合"でググった結果、
--------------
type *.csv | find "," > out.txt
--------------
ファイル名のリストを整列して
その順番で結合することができます。
dir /ON /B *.csv >filelist.dat
FOR /F "delims=" %%i in (filelist.dat) do type "%%i" >>%x%.csv
del filelist.dat
--------------
と言うような記述を見つけていましたが、
結合するだけだと、重複行が、いくつも出来るだけなので、
試していなかったんです。

ファイル名から、項目を付け加えたかったですので。

バッチファイルでも出来るのかも知れませんが、
ちょっと、私の頭では、考えも付かないです。

今後の課題として、バッチファイルも頭の隅に置いておきます。
本当に助かりました。重ねて、ありがとうございました。

[ ]
RE:05759 csvの結合で、お尋ねします。No.05761
yamasan さん 08/02/06 12:39
 
IKKIさん、こんにちは。
お教えのマクロについて、もう一度お願いします。

ファイル名の先頭箇所"20071220"について、
これを日付のタイプとして、"2007/12/20"
としたい場合は、

 $$name = gettext2(0, lineno, linelen2 - 3, lineno);
 $$name1 = gettext2(0, lineno, 4, lineno);
 $$name2 = gettext2(4, lineno, 6, lineno);
 $$name3 = gettext2(6, lineno, 8, lineno);
 $$name4 = gettext2(18, lineno, linelen2 - 9, lineno);
 $$name5 = gettext2(linelen2 - 9, lineno, linelen2 - 7, lineno);

として、
 replaceallfast "^(.*?),(.*?),(.*?),(.*?),(.*?),(.*?),(.*?),(.*?),(.*?)$", $
$name1 + "/" +$$name2 + "/" + $$name3 + "," + $$name4 + ",\\1,\\8,\\9," + $$
name5, regular, inselect;

の様な事で、問題なく動いていますが、
これで、おかしくないでしょうか?
--------------
結合後のファイルに、付け加えて、
保存したいので、マクロの最後には、

 setcompatiblemode 0x0F;
 insert "日付,集会名,会員番号,所属,氏名フリガナ,単位\n";
 saveas "平成19年度.txt"

としました。

大丈夫なようですが、これだけでも良いでしょうか?

どうか、ご指導をお願いします。

[ ]
RE:05761 csvの結合で、お尋ねします。No.05762
IKKI さん 08/02/06 23:00
 
IKKI です。こんばんは。

> と付け加えたら、上手く動作しているようですが、
> 問題ないでしょうか?

問題ないです。

> の様な事で、問題なく動いていますが、
> これで、おかしくないでしょうか?

おかしくないです。

> 大丈夫なようですが、これだけでも良いでしょうか?

良いです。

> バッチファイルでも出来るのかも知れませんが、
> ちょっと、私の頭では、考えも付かないです。

すみません、言葉足らずでした。
私が「スクリプト(バッチファイルのようなもの)」と言ったのは
具体的には JScript, VBScript, Perl, Ruby などのことです。

JScript で同じ作業を行う例を末尾に示します。
これだと秀丸を使わず、かつ、おそらく秀丸マクロより速く仕事が進みます。

VBScript でテキスト処理を行う方法は下記サイトに解説があります。
http://www.atmarkit.co.jp/fwin2k/operation/wsh10/wsh10_01.html
http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/

この機会に、秀丸以外のいろいろな方法も調べてみてはいかがでしょうか。


// ---------------------------------------------------------
// 1. 以下の内容を all-csv.js という名前で保存する
// 2. 対象フォルダを all-csv.js にドラッグ&ドロップする
// 3. 対象フォルダ内に 平成19年度.txt が作られる
// ---------------------------------------------------------
outfilename = "平成19年度.txt";
var fso = new ActiveXObject("Scripting.FileSystemObject");
myfolder = fso.GetFolder(WScript.Arguments(0));
outfilepath = fso.BuildPath(myfolder.Path, outfilename);
outfile = fso.OpenTextFile(outfilepath, 2, true);
outfile.WriteLine("日付,集会名,会員番号,所属,氏名フリガナ,単位");
for (var myfiles = new Enumerator(myfolder.Files); !myfiles.atEnd(); myfiles.
moveNext()) {
 infilepath = myfiles.item();
 infilename = fso.GetFileName(infilepath);
 partsofname = infilename.match(/^(\d{4})(\d{2})(\d{2})\d{6}(?:午前|午後)(.
*)(\d{2})\.csv$/);
 if (partsofname == null) continue;
 n1 = RegExp.$1;
 n2 = RegExp.$2;
 n3 = RegExp.$3;
 n4 = RegExp.$4;
 n5 = RegExp.$5;
 infile = fso.OpenTextFile(infilepath, 1);
 while (!infile.AtEndOfStream) {
  intext = infile.ReadLine();
  outtext = intext.replace(/^(.*?),(.*?),(.*?),(.*?),(.*?),(.*?),(.*?),(.*?),
(.*?)$/, n1 + "/" + n2 + "/" + n3 + "," + n4 + ",$1,$8,$9," + n5);
  outfile.WriteLine(outtext);
 }
}
WScript.echo(outfilepath + " を作成しました");
// ---------------------------------------------------------

[ ]
RE:05762 csvの結合で、お尋ねします。No.05763
yamasan さん 08/02/07 15:18
 
IKKIさん、こんにちは。
IKKIさんに、ご確認いただき一安心ですが、
今日も、又、お願いします。お疲れの所申し訳ありません。

ファイル名が、
"20071208020300午後集会名03.csv"
として、お尋ねしましたが、変更して、

"20071208020300午後集会名A03.csv"
ファイル名の最後に、"A01"〜"B99"と言う具合に、
Aもしくは、Bを入れたいと思いまして、

 $$name = gettext2(0, lineno, linelen2 - 3, lineno);
 $$name1 = gettext2(linelen2 - 10, lineno, linelen2 - 9, lineno);
 $$name2 = gettext2(0, lineno, 4, lineno);
 $$name3 = gettext2(4, lineno, 6, lineno);
 $$name4 = gettext2(6, lineno, 8, lineno);
 $$name5 = gettext2(18, lineno, linelen2 - 10, lineno);
 $$name6 = gettext2(linelen2 - 9, lineno, linelen2 - 7, lineno);

としましたが、問題ないでしょうか?
ファイル名最後から3文字目の
"A"もしくは、"B"を行の最初に持ってきたかったのです。

ところで、
"linelen2"は、論理行頭から改行文字までの文字数との事ですが、
$$name1が、linelen2 - 10というのは、何故、7でなく10なのか、
プラス3 必要なのか、よく分かっていませんので、不安です。

--------------
もう一つ、厚かましいのことをお願いしたいのですが・・。m(_ _)m
よろしければ、もう一段階お願いします。

ファイル名をつける各々の担当者が、半角全角の区別が、
付かない場合があります。ファイル名先頭の日時は、
自動的につけられる箇所なので、考えなくても良いのですが、

ファイル名最後の"A03"の箇所が、全角だった場合は、
ファイル名を変更するような警告のダイアログボックスを
出す事は、出来ませんでしょうか?

「ファイル名の最後の3文字を半角英数字に直してください。」
という感じの警告が出せれば、もう、完成形になるんです。

面倒な事になるのなら、諦めます。

お忙しい中、お疲れの中を、しつこく聞いて恐縮ですが、
どうか、お考えいただきましたら、幸甚です。スイマセン。

--------------
>http://www.atmarkit.co.jp/fwin2k/operation/wsh10/wsh10_01.html
>http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/

ありがとうございます。ブックマークしました。

お教えのall-csv.jsを使ってみたんですが、
何回やっても、

日付,集会名,会員番号,所属,氏名フリガナ,単位

が、一行出来るだけです。
折角お教えいただいたのに、分からないままで、残念です。

ありがとうございました。

[ ]
RE:05763 csvの結合で、お尋ねします。No.05764
h-tom さん 08/02/07 21:53
 

h-tom です。

>お教えのall-csv.jsを使ってみたんですが、
>何回やっても、
>
>日付,集会名,会員番号,所属,氏名フリガナ,単位
>
>が、一行出来るだけです。
>折角お教えいただいたのに、分からないままで、残念です。
こちらの環境では正常に動きますよ。(all-csv.js)
対象ファイルの拡張子(〜.CSV)が、大文字になってませんか?
現状、小文字のみ、対象にしている感じです。
旧  partsofname = (省略)csv$
新  partsofname = (省略)[Cc][Ss][Vv]$
にかえれば、大文字でも小文字でも大丈夫そうですが。

[ ]
RE:05763 csvの結合で、お尋ねします。No.05765
IKKI さん 08/02/07 23:20
 
IKKI です。こんばんは。

一昨日のマクロですが、同じ処理が3〜4行で書けることに気づきました orz
こちらの方がファイル名の仕様変更にも柔軟に対応できます。お試しください。

// 対象フォルダ内にあるファイルのいずれかを開いた状態で実行
grep "^", "*.csv", ".", regular, icon;
if (result <= 0) endmacro;
replaceallfast "(?<=: )(.*?),(.*?),(.*?),(.*?),(.*?),(.*?),(.*?),(.*?),(.*?)
$", "\\1,\\8,\\9", regular;
replaceallfast "^([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{6})(午前|午後)(.*?)([A
-Z0-9A-Z0-9]+)\\.csv\\([0-9]+\\): (.*)$", "\\1/\\2/\\3,\\6,\\8,\\7", reg
ular, nocasesense;

> としましたが、問題ないでしょうか?

問題ないです。

> $$name1が、linelen2 - 10というのは、何故、7でなく10なのか、

先頭の1行(grep)だけのマクロを作って実行してみるとわかると思います。

> ファイル名をつける各々の担当者が、半角全角の区別が、
> 付かない場合があります。

これは事前にファイル名を一括変更してしまうのが正道かと思います。
http://hp.vector.co.jp/authors/VA014830/FlexRena/

マクロ側で検知するなら、 grep の次の行に以下を挿入すればできます。

if (result <= 0) endmacro;
searchdown "[0-9A-Z]+", regular, nocasesense;
while (result) {
 question "ファイル名に全角英数字が含まれています。続行しますか?";
 if (!result) endmacro;
 moveto foundendx, foundendy;
 finddown;
}
gofiletop;

> 何回やっても、
>
> 日付,集会名,会員番号,所属,氏名フリガナ,単位
>
> が、一行出来るだけです。

CSV ファイルが格納されているフォルダのアイコンを all-csv.js のアイコンに
ドラッグ&ドロップしましたか?
たとえば「C:\出席簿\20071208020300午後集会名03.csv」だとしたら
「C:\出席簿」フォルダのアイコンを「all-csv.js」にドラッグ&ドロップです。

それでもダメなら、h-tom さんのおっしゃるように拡張子が大文字か、
あるいは何か別の原因かもしれません。

[ ]
RE:05764 csvの結合で、お尋ねします。No.05766
yamasan さん 08/02/08 12:15
 
h-tom さん、こんにちは。お世話になります。

>こちらの環境では正常に動きますよ。(all-csv.js)
>対象ファイルの拡張子(〜.CSV)が、大文字になってませんか?

ご指摘の通りでした。

>新  partsofname = (省略)[Cc][Ss][Vv]$

仰るとおりです。変更後、問題なくなりました。
お礼を申し上げます。ありがとうございます。

[ ]
RE:05765 csvの結合で、お尋ねします。No.05772
yamasan さん 08/02/08 19:56
 
IKKIさん、こんばんは。お疲れの所、色々、ありがとうございます。
本当に、助かりました。感謝、感謝!!です。

>一昨日のマクロですが、同じ処理が3〜4行で書けることに気づきました orz
>こちらの方がファイル名の仕様変更にも柔軟に対応できます。お試しください。

ありがとうございます。grepのマクロ結果を見て分かりました。
ファイル名の後に、"(1): "と、言う形になるんですね。納得です。

それで、ファイル名を
"20071208020300午後集会名03.csv"
でなく、"20071208020300午後集会名A03.csv"と言うような事でも、
以下のようにやって、やっと、マクロが動くようになりました。
今回は、grepのマクロ結果を見てから、理解できました。

replaceallfast "(?<=: )(.*?),(.*?),(.*?),(.*?),(.*?),(.*?),(.*?),(.*?),(.*?)
$", "\\1,\\8,\\9", regular;
replaceallfast "^([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{6})(午前|午後)(.*?)([A
-Z0-9A-Z0-9])([A-Z0-9A-Z0-9]+)\\.csv\\([0-9]+\\): (.*)$", "\\7,\\1/\
\2/\\3,\\6,\\9,\\8", regular, nocasesense;

しかし、replaceallfastを2回やるとは、さすがです。
とても、思いつきません。

全角文字を調べる件は、
IKKIさんお勧めの「Flexible Renamer 」を担当者に、
教える事にします。(理解してくれるか不安ですが)


>それでもダメなら、h-tom さんのおっしゃるように拡張子が大文字か、

その通り、拡張子が、全て大文字でした。
最初に教えて貰ったマクロで、問題なかったので、
考えが及びませんでした。申し訳ありません。

all-csv.jsのほうも、どうにか、変形して、
使えています。ありがとうございます。

これで、作業がはかどります。ありがとうございました。

[ ]