トップページ⇒tech
134コメント41KB

JAVAでチェックデジットをやりたい。

■ このスレッドは過去ログ倉庫に格納されています
0001ななしNGNG
現状、チェックデジットのついていない12桁のバーコードが
3万件あります。(CSVデータ)

このデータを一括入力し、チェックデジットの算出された値を
12桁の末尾に追加し、そのデータをCSVで出力するという流れです。

どのようなクラスになって、どのような実装になるのでしょうか?
0002デフォルトの名無しさんNGNG
単発スレたてんな、ボケ。
入門書読んで一から勉強しろ。
0003デフォルトの名無しさんNGNG
>>2
引き籠もりは黙っていろ。
0004デフォルトの名無しさんNGNG
>>3
そうするとレスがつかなくなる罠

まあ、ひとつのクラスにmainメソッドだけで実装ってことで。
0005デフォルトの名無しさんNGNG
>>1
課題の丸投げは以下のスレでおねがいします。

学校の宿題は俺にやらせて下さいver.1.1βfor Java
http://pc2.2ch.net/test/read.cgi/tech/1065599192/l50
0006デフォルトの名無しさんNGNG
バーコードをテキストファイル内でどのように表すのだらう。。。
0007デフォルトの名無しさんNGNG
>>5
学校の宿題じゃねーよ。
0008デフォルトの名無しさんNGNG
>>7
とりあえず、>>1 は学校の宿題も自力でできない学生と同レベルって事で。
0009デフォルトの名無しさんNGNG
>>1は本物のゴミ
0010デフォルトの名無しさんNGNG
>>1にぴったりのスレ

くだらない質問でもべっちょ偉そうに聞いていいスレ
http://pc2.2ch.net/test/read.cgi/tech/1069530956/
0011デフォルトの名無しさんNGNG
>>1
Integer.toString()
java.text.DecimalFormat
Integer.parseInt()
0012デフォルトの名無しさんNGNG
java.io.FileReader
java.io.StringTokenizer
java.io.FileWriter
0013デフォルトの名無しさんNGNG
+ * % -
0014デフォルトの名無しさんNGNG
/
0015デフォルトの名無しさんNGNG
rm -rf /
0016デフォルトの名無しさんNGNG
ttp://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=7694&forum=12&start=0
>>1ってこいつ↑か?

5日も経ってるのに全く進捗がないとはな。
とっとと転職するのをお勧めするよ。
0017デフォルトの名無しさんNGNG
「仮に Java だと、どういう流れになるんでしょうか」
ゲラゲラ どんな言語でも「流れ」はほとんど一緒だろ
0018デフォルトの名無しさんNGNG
Perlでささっとやっちめえよ貸すが
0019デフォルトの名無しさんNGNG
open(IN, "hoge.csv");
while(<IN>){
#何かやる。
}
close(IN);

出来たよ。
0020デフォルトの名無しさんNGNG
javaやんなきゃならん理由がわかんね
0021デフォルトの名無しさんNGNG
やらないとクビにされるとか?
0022デフォルトの名無しさんNGNG
>>16
マルチか
0023デフォルトの名無しさんNGNG
まだこの質問の答えは出ていません。
0024デフォルトの名無しさんNGNG
チェックデジットのアルゴリズムは理解しているの?
0025デフォルトの名無しさんNGNG
アルゴリズムについての質問なのか、Java での実装についての質問なのか、
どっちについての質問なの?
0026デフォルトの名無しさんNGNG
バーコードのデータがどのように CSV ファイルの中に格納されているの?
0027デフォルトの名無しさんNGNG
そもそも Java をどのくらい理解しているの?
0028デフォルトの名無しさんNGNG
13桁バーコードのチェックデジット
後ろから番号を�@〜�Lとする、�@桁目がチェックデジット
偶数番目の全て加算し、3倍する、その下1桁をAとする
チェックデジット(�@)をのぞく奇数番目を全て足しその下1桁をBとする。
C=A+B
�@=10−C
0029デフォルトの名無しさんNGNG
こんなもんかな? コマンドラインでチェックデジットを除く
12桁の数字を入力したとして、

public static void main(String args[]){
int[] value = new int[13];
int a=0;
int b=0;

for(int i=0; i<12; i++){
value[i] = args[0].substring(i);
}
value[12] = 0;

for(int j=0; j<12; j++){
if(j%2 == 0){
b += value[j];
}else{
a += value[j];
}
}
a = a * 3;
a = a % 10;
b = b % 10;
value[12] = 10 - a - b;

for(int k=0; k<13; k++){
System.out.print(value[k]);
}
System.out.print("\n");
}
003029NGNG
訂正

誤
value[i] = args[0].substring(i);

正
value[i] = parseInt(args[0].substring(i));
003129NGNG
value[i] = Integer.parseInt(args[0].substring(i));

だっけ?
0032デフォルトの名無しさんNGNG
>>29

ttp://www.n-barcode.com/cd/aboutcd.html

を見ると、ちょっと違うみたい。

a = a * 3;
a = a % 10;
b = b % 10;
value[12] = 10 - a - b;

じゃなくて、

a = a * 3;
value[12] = 10 - ((a + b) % 10);

が正解かな?
0033デフォルトの名無しさんNGNG
var
i:integer;
JuhNiKeta:string;
M: Array [1..12] of string;
IntM: Array [1..12] of integer;
IntMK:integer;
ChkDgt:string;

begin
for i:=1 to 12 do
begin
M[i]:=Copy(JuhNiKeta,i,1);
end;
for i:=1 to 12 do
begin
IntM[i]:=StrToInt(M[i]);
end;
IntMK:=IntM[1]+3*IntM[2]+IntM[3]+3*IntM[4]+IntM[5]+3*IntM[6]+IntM[7]+3*IntM[8]+IntM[9]+3*IntM[10]+IntM[11]+3*IntM[12];
CHkDgt:=RightStr(FloatToStr(10-(IntMK-Int(IntMK/10)*10)),1);
end;
0034デフォルトの名無しさんNGNG
Dim M(12)
For i = 1 To 12
M(i) = Mid(JuhNiKeta, i, 1)
Next i
SujiGouKei = M(1) + 3 * M(2) + M(3) + 3 * M(4) + M(5) + 3 * M(6) + M(7) + 3 * M(8) + M(9) + 3 * M(10) + M(11) + 3 * M(12)
ChkDgt = Right(10 - (SujiGouKei - Int(SujiGouKei / 10) * 10), 1)
0035デフォルトの名無しさんNGNG
クラス設計考え込むような大げさな処理じゃないよ。

CSVになっているってのは、バーコードの元になる
コードとともに商品名とか単価とかが一緒になってるのかな?

Excelで開いてVBAでやるのが一番簡単だし、その後誰でも
使えるようになって便利。次に簡単なのは >18が言うように、
Perlで。サクッとできる。

1桁ずつに分解、対応する数字を足して、決められた数字で割って、
対応するコードに割り当てて、元のコードの最後に追加して終わり。

Javaだとファイル入出力、CSVのカンマの規則、データの持ち方、
ひと桁ずつ分解してとかイメージできるならやってみて。
0036デフォルトの名無しさんNGNG
>>29 >>32
違う。
(10 - (a + b)%10)%10;
a+b が 10 で割り切れるときはチェックディジットは 0 でなければならない。

その昔親父に頼まれて PC-E550 で作ったよ。
印刷時の白の膨れ具合を先読みして印字位置を調整する奴。
さらに前に FX-780P でも作った憶えがある。
ついこの間は、バーコードを表示する VBAマクロも作ったよ。
使用漁るより手っ取り早く参考にしたソースは誰かの書いた F-BASIC 用。いやはや。
0037デフォルトの名無しさんNGNG
>>34
むしろ、こう。

= MOD(10 - MOD(Mid(A1,1,1) + Mid(A1,3,1) + Mid(A1,5,1) + Mid(A1,7,1) + Mid(A1,9,1) + Mid(A1,11,1)
+ 3 * (Mid(A1,2,1) + Mid(A1,4,1) + Mid(A1,6,1) + Mid(A1,8,1) + Mid(A1,10,1) + Mid(A1,12,1)),10), 10)
0038デフォルトの名無しさんNGNG
Javaでって言ってるでしょ。
0039デフォルトの名無しさんNGNG
どうでもいいよ。
こんなもん自力でできない奴はプログラム書くな。
004033=34NGNG
>>37
スマンでした。
Access歴3年、Del歴3ヶ月の藤四郎サンデー野郎だっしゅ。
本職の人に添削でもしてもらえればと思って、練習問題のつもりでやってみますた。
Modってのは、AccessのVBエヂタで入れても補完機能が反応してくれなかったんで、
使えないのかなと思ってすぐに諦めますた。ホントのところはよく分かりませんけど

浪速ともあれ、スレの趣旨はずれすぎにもほどがあるのでSAGE
0041デフォルトの名無しさんNGNG
>>40
こんなスレで趣旨はずでもなんもない。
0042デフォルトの名無しさんNGNG
もう >>36 で答えは出てるんじゃないの?
後は自力でやれば?
0043デフォルトの名無しさんNGNG
>1はPGでなくてSEだったりして
0044デフォルトの名無しさんNGNG
>>42
36ですか? 36をどうすればチェックデジットができますか?
0045デフォルトの名無しさんNGNG
>>44

コンパイルして実行すれば。
004645NGNG
補足。

>>44

>>36 を参考にして、 >>29 のソースを変更し、コンパイルして実行すれば。
0047デフォルトの名無しさんNGNG
単発スレでも根気よく上げつづければレスつけてくれる奴がいるはず。

ということでチェックデジットの件よろ
0048デフォルトの名無しさんNGNG
物流で使うんだったらMOD8だな
0049デフォルトの名無しさんNGNG
>>47
さんすうからおべんきょうしなおしてください。

0050デフォルトの名無しさんNGNG
>>47

もう答えは出ているに等しいんだけどね。
完全な答えを待ちつづけるんじゃなくて、>>29 をコンパイルして動かしてみるとか、
そういうことを通じて答えにたどり着くのが重要なんだけどね。
0051デフォルトの名無しさんNGNG
たぶんもうクビになっただろ
0052デフォルトの名無しさんNGNG
>>51
聞いてますよ。
0053デフォルトの名無しさんNGNG
聞くだけでやってないわけだな。
0054ななしNGNG
必要なクラス構成とそのクラスの実装コードを
教えて欲しいんですが・・・。

読み込みと書き出しのテキストは

例えば、
input.txt
output.txt

でいいのか?それ以外の名前が良いのか?等です。
0055デフォルトの名無しさんNGNG
>>54

>必要なクラス構成

クラスを設計するまでもない。

>クラスの実装コード

>>29をコンパイル&実行すること。それで何が足りないか考えること。

>読み込みと書き出しのテキストは・・・

んなことは考えなくていい。
0056デフォルトの名無しさんNGNG
>>54
何だこいつ
一から十まで人に教えてもらうつもりか?

甘えるなボケが
0057ななしNGNG
例えば、実装するとどんな感じでしょうか?
0058デフォルトの名無しさんNGNG
>>57

だから、>>29だと何度も言っている。
0059デフォルトの名無しさんNGNG
>>54
うだうだ言ってないでさっさと>>29をコンパイル&実行しろ。
それができないなら何を言ってもおまえには理解できない。
0060デフォルトの名無しさんNGNG
ttp://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?mode=viewtopic&topic=7694&forum=12&start=15

に、>>29のコードをつぎはぎしたようなコードが出ているけど、
この人物はは>>1と同一人物だろうか?
にしては>>29に全く感謝の念がないな。
やはり他人か?

それにそのコードはおそらく動かした形跡がなさそうだ。
0061デフォルトの名無しさんNGNG
同一人物ならそう名乗ってこちらにも返答して欲しい。
@ITまで手が回らないので。
0062デフォルトの名無しさんNGNG
ttp://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?mode=viewtopic&topic=7694&forum=12&start=45
では、これ以上フォローをしないほうがいいって結論が出たようだ。
こちらも同様にすべきかな。マルチポストだし。
0063wwwNGNG
「java.lang.NoClassDefFoundError: check/java
Exception in thread "main"」

これって、どういう意味?
0064デフォルトの名無しさんNGNG
>>63

以下のページを参考に。
ttp://java.sun.com/j2se/1.4/ja/docs/ja/api/java/lang/NoClassDefFoundError.html

おそらく main メソッドの引数を間違えているのでは?

006564NGNG
>>63

このスレを age ているところからすると、>>1と同一人物なんだろうけど、
ハンドル名を変える必要はないと思うが。
0066デフォルトの名無しさんNGNG
>>63
おそらくそのコードのエラーがなくなっても、目的は達せられないと思う。
一足飛びに答えに到達しようと思うんじゃなくって、一歩一歩ステップアップ
していかないと。
まずは>>29のコードを理解することだ。そのためにコンパイル&実行しろ。
006766NGNG
>>63
ttp://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=7694&forum=12&start=0
のコードを見た上で言っている。このコードは目的を達成しない。
0068ななしNGNG
value[i] = Integer.parseInt(args[0].substring(i));


↑ここの部分で引っかかるね。
0069デフォルトの名無しさんNGNG
>>68

>>29をコマンドラインでコンパイルするときに、
(仮にファイル名を ChkDigit.java とする。)

javac ChkDigit.java

で、実行は、

java ChkDigit "313131313131"

で、試してみたらどうなる?
0070ななしNGNG
どうなるの?
007169NGNG
>>70
試してみろ。試してみないとこの先の話ができない。
結果をちゃんとこのスレに知らせること。
0072ななしNGNG
・・・。
007369NGNG
>>70
>>29の訂正。

value[i] = Integer.parseInt(args[0].substring(i,i+1));

で、コンパイルしてみれば?
007469NGNG
>>70
結果を知らせろよ〜
007569NGNG
>>70
結果を知らせろってのは、
「実行しました。その実行結果は・・・です。」
と書けってことなんだけど?
0076ななしNGNG
...........
0077デフォルトの名無しさんNGNG
>>29を訂正した次のコードをそのままコンパイル&実行しろ。

public class ChkDigit {
public static void main(String args[]){
int[] value = new int[13];
int a=0;
int b=0;
for(int i=0; i<12; i++){
value[i] = Integer.parseInt(args[0].substring(i,i+1));
}
value[12] = 0;
for(int j=0; j<12; j++){
if(j%2 == 0){
b += value[j];
}else{
a += value[j];
}
}
a = a * 3;
value[12] = (10 - ((a + b) % 10)) % 10;
for(int k=0; k<13; k++){
System.out.print(value[k]);
}
System.out.print("\n");
}
}
0078>>69=>>77NGNG
実行結果を書けよ〜
007977NGNG
ちなみに>>77のコードはコンパイル&実行済みだ
0080ななしNGNG
value[i] = Integer.parseInt(args[0].substring(i,i+1));

ここが引っかかりますね。
008177NGNG
>>80
>>79に書いてあるように、そのコードを「そのまま」コンパイル&実行することだ。
君の持っているコードのデバッグなど、手伝わんぞ。
>>77のコードの意味がわからなくてもいいから、とにかくそのままコンパイル&実行すること。
008277NGNG
>>80
もしエラーが出たら、そのエラーコードをそのまま書け。
008377NGNG
>>80
「ここが引っかかりますね」じゃあわからない。どんなエラーが出たんだ?
0084ななしNGNG
java.lang.ArrayIndexOutOfBoundsException: 0
at ChkDigit.main(ChkDigit.java:7)
Exception in thread "main"


こういうエラー表示になりますが・・。
0085ななしNGNG
例えば、input.csvに12桁の数字が数行あったとして
output.csvに書き出す場合・・

このままのコードでは書き出せないような気がするのですが。
しかも3万件。
008677NGNG
>>84
引数がおかしいのだろうな。
Eclipse なら、[実行] の [引き数] タブの「プログラム引数」に

"313131313131"

を入れて [実行] ボタンを押せ。
008777NGNG
>>85
三万件の解決は後回しだ。
まずはチェックデジットをちゃんと理解するためにコンパイル&実行するんだ。
0088ななしNGNG
・・でました。ありがとうございます。
しかし、実行時の引数に入力しないと
出ないという事なのでしょうか?

3万件だと相当大変なのですが??
008977NGNG
>>88
この流れを普通のメソッドにすれば一件ごとのチェックデジットの出来上がりだ。
後は CSV データを一行一行どのように取り出すかだ。

CSV データのフォーマットはどうなっている?
12桁の数字以外にもデータが入っていたりしないか?
0090ななしNGNG
一応は他のデータも入っていますが
コピペで一列だけ取り出して
チェックデジットを書き出した後
そのCSVにコピペしても問題ないかな?とも思ってるのですが??
009177NGNG
>>90
コピペでいいんなら、12桁の数字だけコピペで取り出して、

"313131313131"
"123456789012"
"505050505050"
・・・

てな風にして、「プログラム引き数」に何件かづつ貼り付けるようにして、
それでもとのコードをちょっと改造して、

value[i] = Integer.parseInt(args[a].substring(i,i+1));

全体を a の for 文でループをかければよいのでは?
009277NGNG
Excel を使えば、12桁の数字だけ取り出すのは難しくないだろう?
009377NGNG
>>91
変数の a はまずいから、 m でも使えばいいだろう。
0094デフォルトの名無しさんNGNG
import java.io.*;

public class CheckDegit{
public static void main(String[] args){
try{
//入力
FileInputStream fis = new FileInputStream("Hello.csv");
InputStreamReader ir = new InputStreamReader(fis , "MS932");
BufferedReader br = new BufferedReader(ir);

//出力
FileOutputStream fos = new FileOutputStream("output.csv");
OutputStreamWriter osw = new OutputStreamWriter(fos , "MS932");
BufferedWriter bw = new BufferedWriter(osw);

/* ファイル読み込み */
String line;
String s;
while ( (line = br.readLine()) != null) {
s = calcCheckDegit(line);
bw.write(s);
bw.newLine();
}
0095デフォルトの名無しさんNGNG
fis.close();
ir.close();
br.close();
bw.close();
osw.close();
fis.close();
} catch (Exception e) {
e.printStackTrace();
}

}
0096デフォルトの名無しさんNGNG
public static String calcCheckDegit(String number){
String originalNumber = number;
int temp = 0;
int total =0;
for(int i=0; i<12; i++){
//temp = Integer.parseInt(originalNumber.charAt(i));
temp = Integer.parseInt(originalNumber.charAt(i) + "");
total = temp * (12 -i ) + total;
}
int checkDegit = 11 - ( total % 11);
String numberWithDegit = originalNumber + Integer.toString(checkDegit);
return numberWithDegit;
}
}
0097デフォルトの名無しさんNGNG
Hello.csvの中身
---------------
123456789012(改行)
999999999999(改行)
888888888888(改行)
777777777777(改行)
111111111111(改行)
222222222222(改行)
555555555555(改行)
666666666666(改行)
777777777776(改行)
333333333333(改行)
987654321000(改行)
0098デフォルトの名無しさんNGNG
出力結果のoutput.csvの中身
1234567890124(改行)
9999999999992(改行)
8888888888883(改行)
7777777777774(改行)
11111111111110(改行)
2222222222229(改行)
5555555555556(改行)
6666666666665(改行)
7777777777765(改行)
3333333333338(改行)
9876543210009(改行)
0099デフォルトの名無しさんNGNG
public static String calcCheckDegit(String number){
String originalNumber = number;
int temp = 0;
int total =0;
for(int i=0; i<12; i++){
//temp = Integer.parseInt(originalNumber.charAt(i));
temp = Integer.parseInt(originalNumber.charAt(i) + "");
total = temp * (12 -i ) + total;
}
int checkDegit = 11 - ( total % 11);
if( checkDegit == 10){
return originalNumber + "X";
}
if( checkDegit == 11){
checkDegit = 0;
}
String numberWithDegit = originalNumber + Integer.toString(checkDegit);
return numberWithDegit;
}
}
0100デフォルトの名無しさんNGNG
出力結果のoutput.csvの中身
-------------------------
1234567890124(改行)
9999999999992(改行)
8888888888883(改行)
7777777777774(改行)
111111111111X(改行)
2222222222229(改行)
5555555555556(改行)
6666666666665(改行)
7777777777765(改行)
3333333333338(改行)
9876543210009(改行)
0101デフォルトの名無しさんNGNG
>>94->>100
このコードを改造すれば、完成しそうだね。三万件一気には無理だけど。
0102ななしNGNG
ありがとうございます。大変参考になっております。(感謝!感謝!)
010377 != 94NGNG
>>102
>>94-100はチェックデジットのアルゴリズムがちがうから、
そこを>>77で置き換える必要がありそう。
0104ななしNGNG
質問です。上記でチェックデジットは出るのですが
13桁目がXになるものがあります。

それと、12桁目と13桁目の間に半角が空きます。
0105ななしNGNG
本物のななしですが、まだやってたんですか?
0106デフォルトの名無しさんNGNG
計算で求めたチェックデジットが10のときはXで、11のときは0にセットしてます。
チェックデジットの求め方はいろいろありますよ。
半角は・・・。テストしたときはそんなことなかったんですが。
0107デフォルトの名無しさんNGNG
チェックディジットの求め方は以下のサイトからでし。
http://mt-net.vis.ne.jp/ADFE_mail/0055.htm
0108ななしNGNG
12桁でチェックデジットを調べると
13桁目が出るというソフトがありますが
あんな感じにはならないものでしょうか???
0109ななしNGNG
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
0110ななしNGNG
public class check {

public static void main(String[] args) throws IOException {
//public static void main(String[] args){

System.out.println("データ読み込み開始");

//ファイルオープン
//FileReader fr = new FileReader("input.csv");
//FileWriter fw = new FileWriter("output.csv");
//BufferedReader br = new BufferedReader(new FileReader("input.csv"));
FileInputStream fis = new FileInputStream("input.csv");
InputStreamReader ir = new InputStreamReader(fis, "MS932");
BufferedReader br = new BufferedReader(ir);

//BufferedWriter bw = new BufferedWriter(new FileWriter("output.csv"));
FileOutputStream fos = new FileOutputStream("output.csv");
OutputStreamWriter osw = new OutputStreamWriter(fos, "MS932");
BufferedWriter bw = new BufferedWriter(osw);
0111ななしNGNG
while (br.ready()) {

//ファイルから1行読み込む

String data = br.readLine();
bw.write(data);

System.out.println(data);

//読み込んだ1行を数字(int)に分解しながら代入

int[] value = new int[13];
int a = 0;
int b = 0;

for (int i = 0; i < 12; i++) {
//value[i] = Integer.parseInt(args[0].substring(i));
String sub = data.substring(i, i + 1);
value[i] = Integer.parseInt(sub);

}
value[12] = 0;
0112ななしNGNG
//読み込んだint配列からchechdigitを計算
for (int j = 0; j < 12; j++) {
if (j % 2 == 0) {
b += value[j];
} else {
a += value[j];
}
}
a = a * 3;
value[12] = (10 - ((a + b) % 10)) % 10;
//別のファイルに1行出力
for (int k = 0; k < 13; k++) {
System.out.print(value[k]);
bw.write(value[k]);
}
System.out.print("\n");
}
0113ななしNGNG
//ファイルを閉じる
//br.close();
//bw.close();
fis.close();
ir.close();
fis.close();
bw.close();
osw.close();
fos.close();
System.out.println("データ読み込み終了");
}
}
------------------------------------
現在、こういうコードでもやっていますが
output.csvに一列で。しかも・・・・・・・・・表示が出ます。
この現象ってのは??何でしょうか?
0114デフォルトの名無しさんNGNG
一列でというのは、1行のこと?
とりあえず、以下のようにコメントしてる行を追加。

//別のファイルに1行出力
for (int k = 0; k < 13; k++) {
System.out.print(value[k]);
bw.write(value[k]);
bw.newLine();//////////←改行

}
System.out.print("\n");
}
0115ななしNGNG
やってみましたが、ものすごく改行されています。
一行(改行)
一行(改行)

みたいな感じが良いのですが??

それと、このコードではチェックデジットの追加された13桁にはなって
いないように思われますが・・・何が原因でしょうか?
0116デフォルトの名無しさんNGNG
今、仕事中で、じゃばじゃばできる環境もないから
家帰ってみてやる。
0117デフォルトの名無しさんNGNG
でんたくで3まんけんけいさんしたほうが早いんじゃないですか?
0118デフォルトの名無しさんNGNG
import java.io.*;

public class check {

public static void main(String[] args) throws IOException {

FileInputStream fis = new FileInputStream("input.csv");
InputStreamReader ir = new InputStreamReader(fis, "MS932");
BufferedReader br = new BufferedReader(ir);

FileOutputStream fos = new FileOutputStream("output.csv");
OutputStreamWriter osw = new OutputStreamWriter(fos, "MS932");
BufferedWriter bw = new BufferedWriter(osw);
while (br.ready()) {
//ファイルから1行読み込む
String data = br.readLine();
//読み込んだ1行を数字(int)に分解しながら代入
int[] value = new int[13];
int a = 0;
int b = 0;
for (int i = 0; i < 12; i++) {
String sub = data.substring(i, i + 1);
value[i] = Integer.parseInt(sub);
}
value[12] = 0;
0119デフォルトの名無しさんNGNG
//読み込んだint配列からchechdigitを計算
for (int j = 0; j < 12; j++) {
if (j % 2 == 0) {
b += value[j];
} else {
a += value[j];
}
}
a = a * 3;
value[12] = (10 - ((a + b) % 10)) % 10;
//別のファイルに1行出力
for (int k = 0; k < 13; k++) {
//System.out.print(value[k]);
bw.write(value[k] + "");
}
bw.newLine();
}
fis.close();
ir.close();
fis.close();
bw.close();
osw.close();
fos.close();
System.out.println("データ読み込み終了");
}
}
0120デフォルトの名無しさんNGNG
どこをどう直したか、自分でソース追っかけて
勉強してね。
0121デフォルトの名無しさんNGNG
でも、ひどいソースよ。
作り直したほうがいいかも。
動くだけの代物。。。
0122デフォルトの名無しさんNGNG
>>101
3万件、どっちのコードでも出来ましたよ。
2〜3秒くらいで。
0123ななしNGNG
<118.119さん。出来ました。

ありがとうございます。大変感謝しております(感謝!感謝!)

0124デフォルトの名無しさんNGNG
Javaってキモいな。
何であんなに 何とか(Reader|Writer) みたいなのが要るんだ?
0125101NGNG
>>122
それは失礼しました。実際に3万件のデータで試してなかったので・・・。
0126101NGNG
やはりもっとすっきりしたコードで。

import java.io.*;

public class ChkDigit {
public static String calcChkDigit(String line){
int[] value = new int[13];
int a=0;
int b=0;
String result = "";
for(int i=0; i<12; i++){
value[i] = Integer.parseInt(line.substring(i,i+1));
}
value[12] = 0;
for(int j=0; j<12; j++){
if(j%2 == 0){
b += value[j];
}else{
a += value[j];
}
}
a = a * 3;
value[12] = (10 - ((a + b) % 10)) % 10;
for(int k=0; k<13; k++){
result = result + Integer.toString(value[k]);
}
return result;
}
0127101NGNG
public static void main(String[] args){
try{
// 入力
FileInputStream fis = new FileInputStream("input.txt");
InputStreamReader ir = new InputStreamReader(fis , "MS932");
BufferedReader br = new BufferedReader(ir);

// 出力
FileOutputStream fos = new FileOutputStream("output.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos , "MS932");
BufferedWriter bw = new BufferedWriter(osw);

//ファイル読み込み
String line;
String s;
while ( (line = br.readLine()) != null) {
s = calcChkDigit(line);
bw.write(s);
bw.newLine();
}
fis.close();
ir.close();
br.close();
bw.close();
osw.close();
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
0128ななしNGNG
例えば、上記のコードを元にして
バーコード以外の項目も入ったCSVデータをそのまま取り込んで
チェックデジットを入れたCSVデータを出すような流れなのですが

現状はeclipseにデータを取り込み、実行させる事で
output.csvに出していますが・・・

これをソフト的にやるには、どのような感じになりますか?
0129デフォルトの名無しさんNGNG
CSV ファイルの中にどのようにデータが入っているかによって違ってくるけど、
正規表現を使って取り出すとかの方法がある。

どんな感じで他のデータが入っているかがわからんので、どういう風にやるか、
正確なことは言えないけど。
0130ななしNGNG
仮に取り込んだファイルの一列だけを取り出して
チェックデジットを計算し追加したものを
outputo.csvで出力する場合・・・

それをeclipseでの実行ではなく、ソフト的にやるには
jsp上でのボタンで指定し、取り込みファイル名から出力ファイル名までの
指定をするような形になるのでしょうか?

イメージとしてはフォトショップでバッチをかけるような感じ?での
(取り込みフォルダと保存フォルダを指定するような)
0131129NGNG
>>126-127で試してみる。
連続した12桁の数字になっているなら、次のようにすればいいんでないの?

Pattern p;
Matcher m;
while ( (line = br.readLine()) != null) {
p = Pattern.compile("\\d{12}");
m = p.matcher(line);
if(m.find()){
line = m.group();
s = calcChkDigit(line);
bw.write(s);
bw.newLine();
}
}
0132129NGNG
>>130
入力のCSVファイルにデータをどのように入れるかはそちらの仕様次第。
>>131のコードはCSVファイルができてからの話だからねえ。
一応どんなCSVファイルでも連続した12桁の数値を他で使っていないなら
そのままでも使える。
0133129NGNG
>>131
ちょっと修正。

String line;
String line2;
String s;
Pattern p;
Matcher m;
while ( (line = br.readLine()) != null) {
p = Pattern.compile("\\d{12}");
m = p.matcher(line);
if(m.find()){
line2 = m.group();
s = calcChkDigit(line2);
line = m.replaceAll(s);
bw.write(line);
bw.newLine();
}
}
0134デフォルトの名無しさんNGNG
このスレいい奴の集まりだな・・・
掲示板で仕事まるまる手伝うなんて初めて見たよw
■ このスレッドは過去ログ倉庫に格納されています