(1)データ量は10万件(40MB)〜20万件(80MB)(分割はできません)
(2)漢字以外は機械的に半角文字に変換、漢字は辞書ファイル(変換対象文字及びその読み方)を作成し、参照しながら半角カタカナ文字に変換する(辞書ファイルは定期的に手動でメンテナンスする)
(3)変換するのは3列目のみ、他の列は変換しない
(4)可能であれば自動処理(コマンドラインやバッチ処理)をしたい
上記内容を実現できるのであればソフトの有料・無料は問いませんが、プログラミングや設定方法など具体的方法を記載いただいた方のみポイントを差し上げます。
CSVを読み込んで、3行目だけ変換するというならば、VBやDelphi等で簡単にできます。
が、問題は、漢字の変換です。
これの仕様が決まらないと 作れないですね。
辞書ファイルをどのようにして作るのか、その仕様を載せてもらえれば 作れます。
http://www.kawao.com/java/kakasi/
KAKASI/Java
URL先のKAKASI/Java、もしくはKAKASIを使用すれば、辞書に基づいて漢字→カナ変換が可能になります。
あとの3行目を取り出したりや全角カナ半角カナ変換はそう難しくないと思います。
http://www.vector.co.jp/soft/win95/util/se015007.html
gawk win32の詳細情報 : Vector ソフトを探す!
awkなり、perlを使えばすぐできると思います。
KAKASIだと、特定の場所(今回の場合CSVの3列目)の変換、というような細かい指定は出来るのでしょうか。
ページを拝見する限りでは行全体の変換をしてしまうように感じたのですが・・・。
>awkなり、perlを使えばすぐできると思います。
すぐ、が出来れば良いのですがプログラミング経験が乏しいため実現は難しいでしょう。
URLは無視してください。
CSV形式であればマイクロソフトのエクセルで開けます。そこでマクロで3列目のデータを取得してStrConv関数でNarrowにしてあげると半角文字に変換できます。
簡単なのは
1.CSVファイルをエクセルに取り込みます。
2.ツール>マクロからVBEを開きます。
3.VBEで挿入>標準モジュールを行い。以下をコピペする。
Sub Hankakuni()
Dim SelectedRange As Range
For Each SelectedRange In Selection
SelectedRange.Value = StrConv(SelectedRange.Value, vbNarrow)
Next
End Sub
4.エクセルに戻り3列目(出来れば必要な範囲を)を選択し反転表示させる。
5.ツール>マクロからHankakuniで処理開始です。
但し4で列全部を選択すると65536回の処理が入るので時間かかっちゃうから データ量によっては必要なセル範囲のみ選択してください。
それも面倒ならば書き込み最終行を見つける関数で見つけさかのぼりながら処理するマクロを組めば大丈夫です。但しエクセルの制限により65536行までしか処理できません。あなたの処理したい行数がこれを超えていたらデータ分割する必要があります。
質問の(1)にて件数・データ容量・分割できない旨を明記しています。
行数はもちろんのこと、40MB〜80MBのデータをEXCELで開くというのは全く非現実的です(ほぼ確実にフリーズします)。
質問の主旨をくみ取っていただければ幸いです。
pya!
URLは無視してください。
まずは、Accessにcsvをインポートし、テーブル名を仮に”T_DATA”とつけます。辞書ファイルの仕様が分かりませんが、とりあえずAccessのテーブルにて編集可能(csv形式でのやり取りが可能とか)を前提とします。
テーブル作成クエリでT_DATAの三列目をグループ化し、同じ漢字をつぶしたテーブルを作成し、”M_KANJI”とします。M_KANJIテーブルの漢字部分のフィールド名を”KANJI”と名づけ、また別にフィールドを追加し、フィールド名を”KANA”とします。KANAフィールドに読み仮名を入力していきます。(既に漢字辞書があるならば、それをAccessに取り込みマスターとするのも可能ですね)
以下の関数をModuleに貼り付けます。
Public Function ZenHenkan(Taisyou As String) As String
Dim wRec As Recordset
Dim wStrSQL As String
wStrSQL = ”SELECT * FROM M_JISYO Where KANJI = ””” & Taisyou & ””””
Set wRec = CurrentDb.OpenRecordset(wStrSQL)
With wRec
If .EOF = False Then
Taisyou = !KANA
Else
Taisyou = StrConv(Taisyou, vbKatakana)
ZenHenkan = StrConv(Taisyou, vbNarrow)
End If
End With
End Function
テーブル作成クエリでT_DATAを追加し、三列目はZenHenkan([三列目])とし、実行します。そうすれば、変換されたテーブルが出来上がりますので、csvでエクスポートすれば・・・というのはダメですか?
ありがとうございます。
正直に言うと、ACCESSを含むプログラミングは少ししか理解できないので、今回ご紹介いただいた方法で良いのかどうかの判断もできません。
とりあえず会社のPCで試してみます。
http://www.hatena.ne.jp/1103014862#
人力検索はてな - 1行15列のCSVデータがあります。この中で、3列目にある全角半角混在文字(ひらがな/カタカナ/数字/漢字/英字)を半角文字に統一させるソフト又は方法を教えて下さい。 (1)..
次のようなJavaコードで実現することができます。CSVTokenizerとkakasiを使っています。Javaがわかる人がいればツールとして完成させることができるでしょう。ご希望であれば私がツールとして完成させますのでコメントにてご連絡ください。
import java.io.*;
import java.util.*;
import jp.ac.wakhok.tomoharu.csv.CSVTokenizer;
import com.kawao.kakasi.*;
public static void main(String args[]) throws Exception {
Kakasi kakasi = new Kakasi();
kakasi.setupKanjiConverter(kakasi.KATAKANA);
kakasi.setupHiraganaConverter(kakasi.KATAKANA);
FileReader filereader = new FileReader(”test.csv”);
BufferedReader bufferedreader = new BufferedReader(filereader);
String line;
while((line = bufferedreader.readLine()) != null) {
int column = 0;
CSVTokenizer tokenizer = new CSVTokenizer(line);
while(tokenizer.hasMoreTokens()) {
if( column != 0 ){
System.out.print(’,’);
}
if( column == 2 ){
// 3列目だけ全角半角変換をする
System.out.print(zen2han(kakasi.doString(tokenizer.nextToken().toString())));
}else{
// それ以外の列はそのまま出力する
System.out.print(tokenizer.nextToken());
}
column++;
}
System.out.println();
}
filereader.close();
}
http://www.hatena.ne.jp/1103014862#lib
人力検索はてな - 1行15列のCSVデータがあります。この中で、3列目にある全角半角混在文字(ひらがな/カタカナ/数字/漢字/英字)を半角文字に統一させるソフト又は方法を教えて下さい。 (1)..
CSVの解析ライブラリ
http://www.wakhok.ac.jp/~tomoharu/Java/csv/
CSVTokenizer & CSVLine
kakasi は 2.の回答者が紹介しているライブラリです。
http://www.hatena.ne.jp/1103014862#zen2han
人力検索はてな - 1行15列のCSVデータがあります。この中で、3列目にある全角半角混在文字(ひらがな/カタカナ/数字/漢字/英字)を半角文字に統一させるソフト又は方法を教えて下さい。 (1)..
適当に作った zen2han です。
public static String zen2han(String motoText) {
String txt = ”アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォャュョッ、。ー「」 ”;
String han = ”アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォャュョッ、。ー「」゛゜”;
String txt2 = ”ガギグゲゴザジズゼゾダヂヅデドバビブベボ”;
String han2 = ”カキクケコサシスセソタチツテト”;
String txt3 = ”パピプペポ”;
String han3 = ”ハヒフヘホ”;
String str = ””;
for (int i=0; i<motoText.length(); i++) {
char c = motoText.charAt(i);
int n = txt.indexOf(c,0);
if (n >= 0) {
c = han.charAt(n);
}
n = txt2.indexOf(c,0);
if (n >= 0) {
str += han2.charAt(n);
c = ’゛’;
}
n = txt3.indexOf(c,0);
if (n >= 0) {
str += han3.charAt(n);
c = ’゜’;
}
str += c;
}
return str;
}
詳細な具体例をご提示いただきありがとうございました。
Javaであれば会社のわかる人間に聞けば解決できる可能性がありますので確認してみます。
以前別サイトにてEXCELで扱える件数で同じ事が出来ないか質問し、マクロを使用した置換処理自動化の方法をご提示いただいたことがありました。
参考URL:http://www.efcit.co.jp/cgi-bin2/wwwlng.cgi?print+200406/0406... のvvvv~さんの回答
今回は対象件数が10万件以上ため質問させていただきました。
辞書ファイルはメンテナンス性を考慮し、CSV形式で「変換対象漢字」「変換後カナ」を設定し、それをできると良いですね。
--------------------
取り付け,トリツケ
取付け,トリツケ
取付,トリツケ
--------------------
上の例は同じ読みですが、上から順番に検索・置換していくことにより「取付け」という文字は「トリツケけ」とならないよう配慮します。
変換の優先順位は(1)英字・数字(3)カタカナ(4)漢字(5)ひらがな、が現実的だと思います。
こういう処理はやはり自作プログラムになってしまうのでしょうか。需要なさそうなので仕方ないかも。