お世話になります、

CSVからデータを取得してDBに書き込む処理を行っているのですが、CSVデータで型が文字のものはダブルクオート(")でくくっています。
(例)
"りんご",100,"円"
"ばなな",200,"ドル"

このままデータをStringTokenizerクラスを使用して取得した場合りんごは("りんご")のようにダブルクオートがついた状態で取得されてしまいます。
ダブルクオートを取り外す方法またはメソッドを教えていただきたいのですが、よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

以前作成した1行文字列をフィールド分割する関数ソースを載せておくので


参考にしてください。
もっといい方法があるのかもしれませんが、とりあえずここでは
一文字ずつ呼んでダブルクオートを削除し、又ダブルクオート内の
カンマはそのまま文字として使用するようにしてます。
面倒だったので文字内にダブルクオートを使用することは考慮に入れてません(^^;

ArrayList parsLine(String line){
 ArrayList fields = new ArrayList();
 if(line == null) return;
 boolean isQuort = false; //ダブルコーテーション内フラグ
 StringBuffer field = null;
 for(int i=0;i<line.length();i++){
  char code = line.charAt(i);
  if(isQuort){
//ダブルクオート内
   if(code == '\"'){
    isQuort = false;
   }
   else{
    if(field == null) field = new StringBuffer();
    field.append(code);
   }
  }
  else{
//ダブルクオート外
   if(code == '\"'){
    isQuort = true;
   }
   else if(code == ','){
    if(field == null) field = new StringBuffer();
    fields.add(field.toString());
    field = null;
   }
   else{
    if(field == null) field = new StringBuffer();
    field.append(code);
   }
  }
 }

 if(field != null){
  fields.add(field.toString());
 }
 return fields;
}
    • good
    • 0

 基本的には#3のkana-tanさんの方法でうまくいくと思うのですが,".." の中に ',' を含むような複雑な文字列を処理したい場合は,java.io.StreamTokenizer クラスを利用すると良いと思います。



 このクラスには,quoteChar(int ch) というメソッドがあって,ch で指定した文字を引用符として解釈してくれます。この指定をしたあと,java.io.StreamTokenizer#nextToken() を使って次のトークンを読み込むと,<ch で指定した文字>の直後から,次に<ch で指定した文字>が現れる直前までを一つの文字列として読み込むことができます。

参考URL:http://java.sun.com/j2se/1.3/ja/docs/ja/api/java …
    • good
    • 0

StringTokenizerクラスのコンストラクタの引数には、区切り文字を指定できます。



次のような、感じです。
(ソース中に"(ダブルクォート)を書いたので見にくくなってすみません)

String str = "\"This\",\"is\",\"a\",\"test\"";    
StringTokenizer st = new StringTokenizer(str,"\",");
while(st.hasMoreTokens()){
     System.out.println(st.nextToken());
  }

結果は
This
is
a
test
と表示されます。

(APIドキュメントのStringTokenizerクラスの説明に記載されているソースを一部改変しました)
    • good
    • 0

一般的かどうかはわかりませんが、


私の場合は jakartaのOROライブラリ(正規表現ライブラリ)
を使って置換しています。

Perlと同じようにsコマンドで置換できます。
outStr = perl.substitute("s/\"//g", inStr);
みたいな感じ。


正規表現ライブラリの使い方については
JavaWorld 2001/4月号にも載っています。

参考URL:http://jakarta.apache.org/oro/index.html
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q縦書きの注釈で半角のダブルクォーテーションマーク

現在ワード2003で卒業論文を書いています。

「メニューの挿入→参照→脚注」で注釈をつけているのですが、そこで参考にした本を書く際に、洋書のタイトルをダブルクォーテーション("")の半角で囲って出したいのですが、なぜか全角表示でおかしな感じになってしまいます。

変換で半角を選択したのにエンターキーを押すと勝手に全角になってしまうんです。

これはどうすれば良いのでしょうか。

回答よろしくお願いします。

Aベストアンサー

>変換で半角を選択したのにエンターキーを押すと勝手に全角に・・・

「メニューの挿入→参照→脚注」から「任意の脚注記号」にダブルクォートを入力して『[全]濁点』に変換する方法ですと前後のダブルクォートは崩れないようですので、試しに操作してみてください

Qread(buf,int,int)メソッドで1文字取得する

javaを使ってプログラミングを勉強しています。

read(buf,int,int)メソッドで受信したバイトデータをbufに格納していると思うのですが、
格納したバイトの最後の文字を取得する方法が分かりません。

送信側では送信バイトの最後の文字をsにして送信します。
受信側では読み込んだバイトデータの最後の文字がsだったら、
ループを抜けるというようにしたいのです。

どうやって最後の文字を取得するのでしょうか?

Aベストアンサー

read(byte[], int, int)の返値を見れば何バイト読み込めたのかは分かるのですから、その値を使って配列の添字を計算するだけです。

QWORDで縦書きのダブルクォーテーションが出ない

WORDで「かっこ」と入力するとその中に””というダブルクォーションが出てきます。これは横書きならいいのですが、縦書きにすると囲んだ字よりその上や下の字にくっついてしまい、非常に醜い結果になります。ずっと前からこの改善を待っているのですが、Microsoft社はもともと外国社であるためか、日本語表記に対して誠実な対応が欠けているのではないかと危惧されます。外字でわざわざ作ってみたのですが、これでは送信したときなど、他のパソコンでは表記されません。何とか対策はないものでしょうか。

Aベストアンサー

No.4です。返信が遅れてしまい、申しわけありませんでした。

「ノノカギ」というのは、おっしゃるとおり「ノの形が二つ並んだ括弧」のことです。手持ちの本には「ダブルミニュート」や「チョンチョン」などと紹介されており、前の回答で紹介させていただいたURLでは文末で図解されています。ほかにも呼び名があるそうですが、とりあえずWordの場合、メニューバーの《挿入(I)》→《記号と特殊文字(S)》をクリック。《コード体系(M)》から「日本語シフトJIS(16進)」を選択し、《文字コード(C)》に「8780」または「8781」と入力、あとはノノカギを選択して《挿入(I)》ボタンをクリックするだけです。あるいは簡単に、「かっこ」と入力して変換していく方法もあります。

ただし、フォントの種類によって成功する場合と失敗する場合があるようで、参考URLでも長々と説明されています。とはいえ私のところ――WindowsXP・Word2002 SP3――では、MS明朝・ゴシックともに問題なく表示されます。この掲示板では機種依存文字が使用できないため似た記号を代用しましたが、おおむね以下のとおりです。

 愛のある ``ユニークで豊かな、、 書体
 の
 あ
 る

  //
 ユ
 ニ
 |
 ク
 で
 豊
 か
 な
//

 書
 体(文例は写研の書体見本帳より)

このように、縦書きはもちろんのこと横書きでも違和感なく表示されます。反対に、DF平成明朝体などでは「囲む対象の文字から括弧が離れて」しまい、いかにも素人くさい文字組になりました。「どのフォントを使うか」に応じて成否がわかれそうですので、いろいろなフォントでお試しください。

私自身「文字」や「印刷」というものに興味を持っており、そういった関心から回答させていただきましたが、下調べが不十分なようでご迷惑をおかけしました。これ以上の回答はできかねますが、何らかの参考にしていただけたら幸いです。

参考URL:http://homepage1.nifty.com/akshiba/kotoba_mozi/yakumono02.html

No.4です。返信が遅れてしまい、申しわけありませんでした。

「ノノカギ」というのは、おっしゃるとおり「ノの形が二つ並んだ括弧」のことです。手持ちの本には「ダブルミニュート」や「チョンチョン」などと紹介されており、前の回答で紹介させていただいたURLでは文末で図解されています。ほかにも呼び名があるそうですが、とりあえずWordの場合、メニューバーの《挿入(I)》→《記号と特殊文字(S)》をクリック。《コード体系(M)》から「日本語シフトJIS(16進)」を選択し、《文字コード(C)》に「8780」または「...続きを読む

Q全パッケージの取得、全クラスの取得、全メソッドの取得

やりたい事は、メインクラスより、同階層の全パッケージを取得(A)、
(A)より同階層の全クラスを取得(B)、
(B)より同階層の全メソッドを取得といったような事です。

例えば
public class a {
public static void main(String args[]) {
 全パッケージの取得
 全クラスの取得
 全メソッドの取得
}
}
みたいな感じに。

試行錯誤したのですが、その処理を行う事の出来るメソッドかどうかも良く分からないし、
コンパイルエラーになるばかりで実現が出来ません。

 ・メインクラスから同階層のパッケージを取得してパッケージ名を出力。
 ・メインクラスからxパッケージ内の同階層のクラスを取得してクラス名を出力。
 ・メインクラスからxパッケージにあるyクラス内のメソッドを取得してメソッド名を出力。

上記のようなめちゃくちゃシンプルなコードを挙げてご教示願います。

Aベストアンサー

どういったことをされたいのか不明なので断片的な回答になってしまいますが、
自分のパッケージを取得するには
Class#getPackageでできます。
パッケージに属する全てのクラスを取得する方法は、残念ながら存じません。
クラスが持っているメソッドを取得するには、Class#getMethodsで取得できます。

一度、JavaDocを眺めてみては如何でしょう?
java.lang.*とか、java.lang.reflectあたりが参考になると思います。
あとは、リフレクションについても調べてみて下さい。

Qダブルクォーテーション(””)を出力する方法(java)

javaでダブルクォーテーション(””)を出力する方法を教えて下さい。

ダブルクォーテーションが含まれたテキストを出力しようと、
fout.print("○○○");
のようにして○○○の中にダブルクォーテーションが含まれたテキストを入力するとエラーが起こります。
○○○の中の一つ目のダブルクォーテーションが閉じるダブルクォーテーションと認識されてしまっているようなのです。

どうしたらダブルクォーテーションを出力することができるか教えて下さい。
よろしくお願いします。

Aベストアンサー

こんにちは、

今ひとつ、意味解りませんが、下記のようなことですか??

System.out.println("\"ssss\"");

出力結果
"ssss"

Qjava,StringTokenizerの使い方について

和英辞書アプリケーションを作っています。
BufferedReaderで読み込んだtxtファイルをStringTokenizerで区切りたいのですが、使い方がよくわかりません。


現状は

try{BufferedReader japanesefile = new BufferedReader(new FileReader("word/01japanese.txt"));
while ((jp=japanesefile.readLine())!=null) {japWord[n1] = jp; n1++;}
japanesefile.close();}
catch(IOException ie){System.exit(1);}

上記のBufferedReaderで






といった日本語、英語別のtxtファイルを読み込んでます。


これを

赤,red
青,blue
緑,green

というBufferedReaderで読み込んだtxtファイルを

japWord[0] = "赤"
engWord[0] = "red"
japWord[1] = "青"


という風に分けたいのですが、どうすればよいでしょうか?
java習い始めで質問の仕方すらままならないですが、よろしくお願いします。

和英辞書アプリケーションを作っています。
BufferedReaderで読み込んだtxtファイルをStringTokenizerで区切りたいのですが、使い方がよくわかりません。


現状は

try{BufferedReader japanesefile = new BufferedReader(new FileReader("word/01japanese.txt"));
while ((jp=japanesefile.readLine())!=null) {japWord[n1] = jp; n1++;}
japanesefile.close();}
catch(IOException ie){System.exit(1);}

上記のBufferedReaderで






といった日本語、英語別のtxtファイ...続きを読む

Aベストアンサー

System.exitを使ってるあたりがC使いですね。

Javaだとあんまり使いません。

で、StringTokenizerですが、便利です。

APIのコンストラクタは(文字列,区切り文字)です。
なので、上記の場合、区切り文字は「,」なので以下のようなソースになると思います。

String line = "赤,red";

StringTokenizer tokenizer = new StringTokenizer(line,",");
String[] array = new String[tokenizer.countTokens()];
int i = 0;
while(tokenizer.hasMoreElements()){
array[i] = (String)tokenizer.nextElement();
i++;
}

参考URL:http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/util/StringTokenizer.html

System.exitを使ってるあたりがC使いですね。

Javaだとあんまり使いません。

で、StringTokenizerですが、便利です。

APIのコンストラクタは(文字列,区切り文字)です。
なので、上記の場合、区切り文字は「,」なので以下のようなソースになると思います。

String line = "赤,red";

StringTokenizer tokenizer = new StringTokenizer(line,",");
String[] array = new String[tokenizer.countTokens()];
int i = 0;
while(tokenizer.hasMoreElements()){
array[i] = (String)tokenizer.nextE...続きを読む

Q文末のダブルクォーテーションマークとピリオドの位置関係

英語の質問です。米国では文の末尾がダブルクォーテーションマークとなる場合、ピリオドはその末尾のダブルクォーテーションマークの左(つまりダブルクォーテーションによる引用の内側)になるのが一般的ですか。

すなわち、例えば:

This is a "pen".
This is a "pen."

では、下の文の様式になるのが一般的ですか。

Aベストアンサー

以前同じような質問があり、そのとき少し調べて回答したことがあります。
結論を言えば、「米国では」ピリオドは末尾のダブルクォーテーションマークの前におくのが普通です。

典拠として二つの本を挙げておきます。
まず、The Chicago Manual of Style によると (6・8)
「ピリオドやコンマは、末尾のクォーテーションマークの前に置かれる。クォーテーションマークがダブルでもシングルでも同じである。これは、このマニュアルの初版(1908年)以前から用いられている伝統的方式である。」
とされています。
ただし、6・10では「別の方式」として
「The Oxford Guide to Style に述べられている、しばしば「イギリス方式」(the British style) と呼ばれるものによれば・・・引用される資料にもともと含まれている句読点だけがクォーテーションマークの内部に含まれる。他の句読点は末尾のクォーテーションマークの後にくる」と注記されています。

また、Fowler's Modern English Usage (イギリス英語の標準的用法の権威ある解説書)の "quotation marks"の項を見ると、アメリカの本とは逆に、
Our subject is the age of Latin literature known as 'silver'.
という例を挙げて、'silver’のような単語には句読点は属していないので、こうした場合句読点はクォーテーションマークの外側に置かれるべきであると説明した後に「アメリカ英語では」末尾のクォーテーションマークがピリオドの外に置かれることが多いと注記しています

参考URL:http://oshiete1.goo.ne.jp/qa887609.html

以前同じような質問があり、そのとき少し調べて回答したことがあります。
結論を言えば、「米国では」ピリオドは末尾のダブルクォーテーションマークの前におくのが普通です。

典拠として二つの本を挙げておきます。
まず、The Chicago Manual of Style によると (6・8)
「ピリオドやコンマは、末尾のクォーテーションマークの前に置かれる。クォーテーションマークがダブルでもシングルでも同じである。これは、このマニュアルの初版(1908年)以前から用いられている伝統的方式である。」
とされていま...続きを読む

QJavaScriptで複数のCSVを取得しひとつのCSVごとに1つのs

JavaScriptで複数のCSVを取得しひとつのCSVごとに1つのselectフォームを表示しようとしております。
以下のようなJSを使っているのですが、aryCsvNameの配列にはいっている名前で複数のCSVを呼び込みたいのですが、
getElementById("select***").のところで、うまく***の箇所に配列の値をもっていけません。

aryCsvNameの値と***があえば、それぞれの<div>に表示されるのではないかとは思っているのですが、
それも予想です。
恐れ入りますが、どなたかいい方法をご教授ください。

function loadCSV() {
aryCsvName = ["1","2","5","10"];
for (var j = 0; j < aryCsvName.length; j++) {
var path = './data/'+aryCsvName[j]+'.csv';
var httpObj = createXMLHttpRequest(handleResult);
if (httpObj) {
httpObj.open("GET", path, true);
httpObj.send(null);
}
}
}
function handleResult() {
if ((this.readyState == 4) && (this.status == 200)) {
var text = getAjaxFilter()(this.responseText);
csvData = parseCSV(text);

///ここが不明
//document.getElementById("select***").innerHTML = result;
//ここまで
}
}
function parseCSV(str) {
var CR = String.fromCharCode(13);
var LF = String.fromCharCode(10);
var lines = str.split(LF);
var csvData = new Array();

for (var i = 0; i < lines.length; i++) {
var cells = lines[i].split(",");
if( cells.length != 1 ) csvData.push(cells);
}
return csvData;
}

function createXMLHttpRequest(cbFunc) {
var XMLhttpObject = null;
try {
XMLhttpObject = new XMLHttpRequest();
} catch(e) {
try {
XMLhttpObject = new ActiveXObject("Msxml2.XMLHTTP");
} catch(e) {
try {
XMLhttpObject = new ActiveXObject("Microsoft.XMLHTTP");
} catch(e) {
return null;
}
}
}
if (XMLhttpObject) XMLhttpObject.onreadystatechange = cbFunc;
return XMLhttpObject;
}

function getAjaxFilter() {
if (navigator.appVersion.indexOf("KHTML") > -1) {
return function(t) {
var esc = escape(t);
return (esc.indexOf("%u") < 0 && esc.indexOf("%") > -1) ? decodeURIComponent(esc) : t
}
} else {
return function(t) {
return t
}
}
}

HTML部分
<div id="select1"></div>
<div id="select2"></div>
<div id="select5"></div>
<div id="select10"></div>

JavaScriptで複数のCSVを取得しひとつのCSVごとに1つのselectフォームを表示しようとしております。
以下のようなJSを使っているのですが、aryCsvNameの配列にはいっている名前で複数のCSVを呼び込みたいのですが、
getElementById("select***").のところで、うまく***の箇所に配列の値をもっていけません。

aryCsvNameの値と***があえば、それぞれの<div>に表示されるのではないかとは思っているのですが、
それも予想です。
恐れ入りますが、どなたかいい方法をご教授ください。

function loadCSV() {
aryC...続きを読む

Aベストアンサー

このケースで一番、簡単そうな解決策は、
それぞれのCSVファイルの中に、どのセレクト用なのかの
目印を書き込んでおき、それで判定だと思いますが、
それが出来ないなら、非同期通信は止めて同期通信
にして、1ファイル毎に確実に読み込む。(詳しく見てないけど)
 httpObj.open("GET", path, false);
かな

それがいやなら、XHR(XmlHttpRequest)の、レスポンスヘッダーを
コールバック関数の中で自分で調べて、何への要求か見つけて
処理を分けるといったところかな。

 this.getAllResponseHeaders()

どのブラウザーのXHRでも出来るかどうかは?

Qシングルクォーテーションとダブルクォーテーション

いつも楽しく拝見させて頂いています。
初心者ですが宜しくお願いします。
シングルクォーテーションとダブルクォーテーションの使用方法について質問させて頂きます。
select文でテーブル名を指定するときはそのまま(たとえば'名前'じゃなく名前)しないとエラーになります。そういう風なシングルクォーテーション(又はダブルクォーテーション)を使ってはいけないところ、またシングルクォーテーションにしないといけないところ、ダブルクォーテーションにしないといけないところを教えて頂けますでしょうか?もし両方OKならその違い等も教えていただけるとうれしいです。
以上宜しくお願いします。

Aベストアンサー

文字定数は、「'」で囲む必要があります。

例)SELECT 'ABC' →文字定数の'ABC'と解釈される
SELECT ABC →ABCは、表名や列名と解釈される

数値定数は、多くのRDBMSでは「'」で囲みませんが、MySQLでは独自仕様として囲むことが可能です。

例)SELECT 123 →数値定数の123
SELECT '123' →一般的なRDBMSでは文字として扱われる。MySQLでは数値としても扱える

殆どのRDBMSには予約語があり、RDBMSでは予約語を頼りに構文解析します。表名や列名に英単語やその組み合わせを使おうとすると、予約語とぶつかってしまうことがあります。

例)SELECT FROM FROM →予約語のSELECT FROMの間に「*」や列名が指定されておらず、RDBMSは構文誤りと認識する

それを回避するために、標準SQLでは「"」で表名や列名を囲みます。MySQLでは、文字コードにANSIを使う場合は、「"」で、それ以外には独自仕様で「`」(バッククォーテーション)を使います。

例)SELECT "FROM " FROM →多くのRDBMSでは「"」で囲むことで、RDBMSに最初の「FROM」は、列などの名前であることを知らせる
SELECT `FROM` FROM →ANSI以外のMySQLでは、「`」(バッククォーテション)で囲む

また、「-」(ハイフォン)を表名や列名に使う場合、「"」で囲まないと、SQLでは減算と解釈されます。このように、「"」で囲むことで、記号なども名前に使用することができます。

例)SELECT ABC-DEF →列ABCと列DEFの減算と解釈される
  SELECT "ABC-DEF" →列「ABC-DEF」と解釈される
  SELECT `ABC-DEF' →ANSI以外のMySQLでは、「"」でなく「`」(バッククォーテション)を使用

文字定数は、「'」で囲む必要があります。

例)SELECT 'ABC' →文字定数の'ABC'と解釈される
SELECT ABC →ABCは、表名や列名と解釈される

数値定数は、多くのRDBMSでは「'」で囲みませんが、MySQLでは独自仕様として囲むことが可能です。

例)SELECT 123 →数値定数の123
SELECT '123' →一般的なRDBMSでは文字として扱われる。MySQLでは数値としても扱える

殆どのRDBMSには予約語があり、RDBMSでは予約語を頼りに構文解析します。表名や列名に英単語やその組み合わせを使おうとすると、予...続きを読む

QCSVファイルのダウンロード時に、パラメータ(Getメソッドで渡される

CSVファイルのダウンロード時に、パラメータ(Getメソッドで渡される
CGI引数(QUERY_STRING環境変数の中身))を、
Javaサーブレット(doGetメソッド内)内で、以下のようにして
  ↓
final ResultSetMetaData meta = rs.getMetaData();
response.setContentType("application/octet-stream;charset=utf-16le");

final StringBuffer sbUrl = new StringBuffer();
sbUrl.append("KYOIKU.csv");
sbUrl.append("?").append("20101029162359");

response.setHeader("Content-Disposition", "attachment; filename="
+ sbUrl.toString());

out = response.getWriter();

として実行してみたところ、
半角の?(クエスチョンマーク)が、
半角の_(アンダーバー)に変換されて、
テキストファイルとして出力されています。
(KYOIKU.csv_20101029162359)

イメージとしては、doGetメソッドからのCSVファイルダウンロード時に、
URLとして、
「http://hogehoge.co.jp/KYOIKU.csv?20101029162359」
として、セット後に実行したいと思っております。


そこでご質問内容なのですが、
ネットで調べていて、先程たまたま、
「URLの末尾にユニークな捨て文字を付加するという手法」として、
「ダウンロードするファイルを、キャッシュにあるファイルとは別物だとIE
 に思わせれば、結果的に目的を果たせます。
   ↓
 (目的とは、CSVファイルのダウンロード時に直接[開く]を押下した場合に、
  余計な→[1]文字列が自動的にExcelファイル名として追加されなくなること)」
という記事をたまたま見つけました。

それを試す為に、
「URLの?文字、およびそれ以降の文字列」を、
どのようにすれば、セットできるのか?
その方法を教えてください。

お世話になります。
宜しくお願い致します。

CSVファイルのダウンロード時に、パラメータ(Getメソッドで渡される
CGI引数(QUERY_STRING環境変数の中身))を、
Javaサーブレット(doGetメソッド内)内で、以下のようにして
  ↓
final ResultSetMetaData meta = rs.getMetaData();
response.setContentType("application/octet-stream;charset=utf-16le");

final StringBuffer sbUrl = new StringBuffer();
sbUrl.append("KYOIKU.csv");
sbUrl.append("?").append("20101029162359");

response.setHeader("Content-Disposition"...続きを読む

Aベストアンサー

もしかして勘違いなされてるかもしれません。
「URLの?文字、およびそれ以降の文字列」は、
「クエリ情報」と呼ばれています。

「クエリ情報」とは、
URLの末尾の「~?」以降に、
「キー名=値」で追加される簡易情報です。

パス本体とクエリ情報は、
「?」(半角のクエスチョン文字)で区切っていて、
複数のキーがある場合には「&」(半角のアンド文字)で
連結します。

たとえば、
<form>タグでGETオプションを指定した場合などに、
フォームに入力されたデータが、
すべてクエリ情報としてサーバに送信されますよ。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報