• ベストアンサー

ファイルの1行のデータをbyte単位でストリング配列に書き込みたい

こんばんは。お世話になります。 ファイルに固定長のデータがあります。1行につき20件位あります。 データは固定長なので、行が変わってもデータの項目名は変わりません。最終的には、このデータをDBに入れます。 CSVファイルだと、カンマで区切ってあるので、データを分けることが出来るのですが、固定長のデータはどういう方法で、区切るのでしょうか? 誰か分かる方は教えてください。よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • covachan
  • ベストアンサー率38% (46/120)
回答No.3

コンストラクタに String(byte[] bytes, int offset, int length) と言うのがありますがこれを使えばすむ話ではないのですか?

kamkamkam3
質問者

お礼

ご返事どうもありがとうございます。 ズバリですね。こんな便利なコンストラクタがあるとは。。。今まで、3日位悩んでいたのですが、見事に解消されました。大変感謝しております。 私は、配列の計算などのアルゴリズムが苦手なものですから、大変苦労しておりました。明日、SEが出張から返ってくるので、今夜中に仕上げたいと思います。どうもありがとうございました。とても、助かりました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.2

> 実は、全角のデータが含まれておりまして、出来ないのです。 中途半端な回答で申し訳ない (^^; ただの思いつきですが、String#getBytes() を使ってばらしてみてはどうでしょうか? > ただいま、正規表現を根性で勉強しています。 Java の資料をあたるより perl の資料をあたった方が分かりやすいかもしれませんね。 ただ、正規表現というのは、あくまでも *文字ベース* なので、この質問のケースには 利用しにくいかも。

kamkamkam3
質問者

お礼

どうも、ご回答ありがとうございます。 String.getBytes()やら、ByteArrayInputStreamクラスなどを試してはいますが、エラーが出てしまうんです。。。 現状としては、BufferedReader.readLine()で1行読み込んで、その後、getBytes()でバイトを取得しています。それから、new String(バイト配列) としていますが、ArrayIndexOutOfBoundsException がでてしまいます。 テストプログラムではうまくいっているので、もう一息だと思います。 どうもありがとうございました。では、またの機会に。

全文を見る
すると、全ての回答が全文表示されます。
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.1

String#substring() や StringBuffer#substring() を使って、切り出してゆきます。

kamkamkam3
質問者

補足

どうもありがとうございます。 私もそう思ったんですが、実は、全角のデータが含まれておりまして、出来ないのです。というか、やろうとすれば出来るんだとは思うんですが(半分くらいは作ってあります)もっと便利なクラスがないかと思い、質問しました。 a-kumaさん、いつもありがとうございます。実を言いますと、とても久しぶりの現場で、少々きつい目にあっております。a-kumaさんもお仕事頑張って下さい。私も、この現場がキーポイントとなっております。ただいま、正規表現を根性で勉強しています。では、ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • CSVファイルの項目行を削除して結合するには?

    お世話になります。m(__)m 2000行ほどのCSVファイルが数個あります。 このCSVデータをすべてひとつのファイルに結合したいのですが、 ・それぞれのファイルの1行目にある項目データを削除したい。 ・結合後の1行目には項目名を残したい。 ・可能であればコピーバッチのようなもので作成したい。 と、このように思っております。 どのような手があるか教えて下さい。

  • 1行目と2行目の間にデータを書き出すには・・・。

    私はプログラマではないのですが、会社でPHPプログラムの修正を頼まれてしまいました。 ■現在のプログラム ----------------------------------- $fp = fopen( $CSVFileName, "a+" ); $a = fseek($fp,0,SEEK_END); $ret = fputs( $fp, $CSV_SJIS); fclose($fp); ----------------------------------- 現在は、以上のような方法で新しいデータを追加しているのですが、これをデータファイルの2行目に追加するように変更して欲しいと言われています。 なぜ、そのような要求が出たかというと、データファイルというのがCSV形式のファイルで、1行目にはExcelで処理するための列名(項目名)が入っています。よって2行目に新しいデータを追加したいのです。 どなたか詳しい方がいらっしゃいましたら、回答をお願い致します。

    • ベストアンサー
    • PHP
  • csvファイルをAccessに取り込むとデータ数が増える

    項目をカンマで区切っただけの単純なcsvファイルをAccessでインポートしてテーブルを作成したら、データ数が増えてしまいました。 (csvファイルをテキストで開いたときの行数と、Accessの行数が異なる) 5000件ぐらいなら、csvもAccessもデータ数は同じなのですが、データ数が大きくなると、csvとAccessのテーブルで6万件とかの差分が出てしまいます。 csvファイルとAccessで、データ数を同じにするにはどうしたら良いでしょうか。 参考になるURLでも良いので、教えて頂ければと思います。 よろしくお願いします!

  • csvデータの開始行と最終行を全体の4分の1で区切り処理をしたい

    csvデータの開始行と最終行を全体の4分の1で区切り処理をしたい csvデータの開始行と最終行を全体の4分の1で区切り処理をしたいと思ってます。 csvファイルは20万件あります。4分の1なので1~50000件となります。 今回は50001~100000件までを行いたいのですが、先日教えていただいたwhile($lines = <IN>) ですと、最初から1件ずつ最終行まで処理をしてしまいます。 (ここから) open(OUT,">$csv"); open(IN,"$data") || &error(" $data を読み込みopen出来ません"); while($lines = <IN>) { ($seq1,$categ,$password,$imail,$cont) = split("\,", $lines); $cont .= " "; $data = "$seq1,$cont,1\n"; print OUT "$data"; $data = ""; } close IN; close OUT; (ここまで) 今回は20万件ですが、毎回このデータ量は月次ごとに変わります。 while周辺をいじるような気がしていますがどのようになるのかがわからなかったので質問いたしました。 お手数かけます。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 5行目からのCSVデータを作りたい

    いつもお世話になります。 とあるシステムにデータを入力して、CSVファイルを作成して別システムにインポートしているのですが、そのファイルフォーマットがデータが5行目から始まる形のものなのです。とある事情からそれをエクセルで作成しなければならず、CSVで保存したものを開くと空白行を無視して1行目から始まってしまいます。 1から4行目までを空白にしてCSVを作成する方法をご教授ください。

  • VBでCSVファイルのある行をインポート

    VBでCSVのインポートをしたいのです。 CSVファイルの中身で、最初の5行は読みません。そして、カンマ区切りの行の最初の文字が数字である場合だけを読みたいのです。で最後の3行も読みません。 ですので、CSVのデータを読む場合に最初の5行を飛ばすという方法か、カンマ区切りの行の最初の文字が数字の場合だけ読むという方法はありませんでしょうか。 Line Input #intFileNo, strTextLine strTextLine = Replace(strTextLine, """", "") str = Split(strTextLine, ",") こんな感じのコードで考えてます。 お分かりの方いましたらお願いします。

  • CSVファイルの最終行のデータを取り出したい

    PHPでCSVファイルのデータを取り込もうとしています。 全てのデータを表示させるのであれば、「while」などを使って書くのが一般的かと思うのですが、 最終行のデータ(「,」で区切られた最も左のフィールド)だけを取り出したいので、 以下のように書いてみました。 <?php $file = fopen("hoge.csv","a+"); $nakami = fgetcsv ($file, 1000, ","); echo $nakami[0]; fclose($file); ?> 「fopen」のmodeについて、「r」にすれば先頭から読み込まれ、 「a+」もしくは「ab+」ならばファイルの終わりにポインタが来る・・・ と色々なマニュアルに書かれていましたので、上記のようにしてみたのですが、 $nakami[0]で表示されるのは、1行目の最左列のデータになってしまいます。 1)このやり方(modeの設定)では最終行のデータ取得は不可能なのか 2)どのようなやり方なら最終行のデータ(のみ)は取得できるのか お知恵をお借りできれば幸いです。 よろしくお願いいたします。

    • 締切済み
    • PHP
  • PL/SQLで文字列を分割

    PL/SQLで、CSVファイルを読み込んでDBにデータを登録しようとしています。 CSVの1行を読み込んだあと、 カンマで区切ってリストに格納してくれるような 便利な関数は無いのでしょうか? 1行の先頭から1文字づつカンマかどうか調べて取り出す、よりも簡単な方法があれば是非教えて下さい。

  • VBS 複数ファイル複数行を配列格納

    ある配下のCSVファイル2個(固定)を読み込み、 コンピュータ名の列が同じ行を比較するというツールを作っています。 考えた結果以下まではできましたが、どうしても指定行を配列に埋め込み処理ができません。 比較方法はわかります。 ですが以下のプログラムでは、CSVの行は複数行あるので最終行しか格納されません。 どのようにしたら、2つのCSVファイルそしてすべての行を配列に入れ込むことができるのでしょうか。 For Each FileName In src.Files FileEx = fso.GetExtensionName(FileName) If LCase(FileEx) = "csv" Then Set CsvFile = fso.OpenTextFile(FileName) Do Until CsvFile.AtEndOfStream tmpLine = CsvFile.ReadLine If roopCnt = 0 Then '1個目のCSV ArrayA = Split(tmpLine,",") Else '2個目のCSV ArrayB = Split(tmpLine,",") End rowCnt = rowCnt +1 Loop roopCnt = 1 End If Next

  • 【csv】空白セルをカウントさせないためには

    エクセルファイルをcsvで保存する際、不要なところにもカンマが付いてしまって困っています。 例) 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24, T,77,2008123,133648,,,,,,,,,,,,,,,,,,,, というように、本文データ(24項目)に対して、フッターデータ(4項目)を最終行に挿入する際、 フッタデータの末尾に不要なカンマ(20個)が付いてしまいます。フッターには4項目以外の値は入っていません。 また、対象の範囲の値の削除し保存してみても、カンマが付いてしまいます。 このカンマを付けずにcsvを保存する方法を教えてください。 この作業は繰り返しの作業になるので、マクロを組みたいと考えています。 宜しくお願いいたします。