2

トークナイザーを使用して .txt ファイルの内容をベクターに挿入しようとしています。しかし、特定のファイルは挿入されません。また、後でベクターの内容を後でjtableに渡す必要があります。問題は、.txtの最初の行にnull値があるため、挿入されず、最初の行をスキップして先に進むことです.. null を vector に格納して " " に置き換える方法はありますか?

private void loadSecondPreview() {
  String aLine;
  recordData = new Vector();
  columnNames = new Vector();

  try {
    FileInputStream fin = new FileInputStream(dataFile);
    BufferedReader br = new BufferedReader(new InputStreamReader(fin));
    // extract column names
    if (delimiter == ",") {
      StringTokenizer st1 =
        new StringTokenizer(br.readLine(), ",");
      while (st1.hasMoreTokens()) {
        columnNames.addElement(st1.nextToken());
    }
    // extract data
    while ((aLine = br.readLine()) != null) {
      StringTokenizer st2 =
        new StringTokenizer(aLine, ",");
      while (st2.hasMoreTokens()) {
        recordData.addElement(st2.nextToken());
      }
    }
  } else if (delimiter == "\t") {
    StringTokenizer st1 =
      new StringTokenizer(br.readLine(), "\t");
    while (st1.hasMoreTokens()) {
      if (st1.equals(null)) {
        columnNames.addElement(" ");
      } else {
        columnNames.addElement(st1.nextToken());
      }
    }
    // extract data
    while ((aLine = br.readLine()) != null) {
      StringTokenizer st2 =
        new StringTokenizer(aLine, "\t");
      while (st2.hasMoreTokens()) {
        if (st2.equals(null)) {
          recordData.addElement(" ");
        } else {
          recordData.addElement(st2.nextToken());
        }
      }
    }
  }
  br.close();

  System.out.println("Column vector size:" + columnNames.size());
  System.out.println("Record vector size:" + recordData.size());

  for (int x = 0; x < columnNames.size(); x++) {
    System.out.println("Column vector:" + x + " " + columnNames.elementAt(x));
  }

  for (int x = 0; x < recordData.size(); x++) {
    System.out.println("Record vector:" + x + " " + recordData.elementAt(x));
  }

O/P: **列ベクトル サイズ:0 レコード ベクトル サイズ:5 レコード ベクトル:0 8 レコード ベクトル:1 8.100 レコード ベクトル:2 8.200 レコード ベクトル:3 9 レコード ベクトル:4 9.8

テスト ファイル レコード:最初の行に 2 つの null 値列があります

8 8.100 8.200 9 9.8

4

4 に答える 4

2

これを試して

BufferedReader in = new BufferedReader(new FileReader(loc + fname));
    ArrayList<String []> input = new ArrayList<String []>();
    String [] temp;
    String line;
    String stemp = null, sprev;
    ArrayList<String> comp = new ArrayList<String>();
    while((line = in.readLine())!= null)
    {
        StringTokenizer st = new StringTokenizer(line, ",", true);
        temp = new String [15];
        int i = 0;
        while(st.hasMoreTokens())
        {
            sprev = stemp;
            stemp = st.nextToken(); 
            if((stemp.equals(sprev)) && stemp.equals(","))                
            {
                //it is a null field
                temp[i++] = null;                    
            }
            else if(!(stemp.equals(",")))
            {
                temp[i++] = stemp;
            }
        }
        input.add(temp);

私のために働く

于 2012-11-05T23:33:44.280 に答える
1

このようなもの:

add(value == null ? "" : value)
于 2012-06-02T05:53:47.160 に答える
0

コードの次の行

if (st1.equals(null)) {

意味がありません。次のトークンを返すかどうかではなく、トークナイザーが存在するかどうかをテストしています。

次のパターンを使用します。

String nextToken = tokenizer.nextToken()
if (nextToken != null) {
    ....
}

変数を使用してください2 つのトークンif (tokenizer.nextToken() == null) { vec.add(tokenizer.nextToken()); }を使用するためです。1 つはテスト用、もう 1 つは追加用で、テスト全体が無意味で壊れたものになります。

短いから速くなるわけではありません。初歩的なエラーです。コードを少なくして最適化しようとしています。

于 2012-06-03T01:22:51.123 に答える
0

ベクターを使用する理由 順序を維持するため、リストを検討してください。null の代わりに空白文字列を置き換える方法は複数あります。コード内の 1 つの場所からのみオブジェクトを追加する場合は、Tomが言及したものよりも機能します。複数の場所がある場合は、Vector を拡張して追加をオーバーライドしたり、便利なメソッドを使用したりするよりも、1 つの場所でのチェックを最小限に抑えることができます

于 2012-06-02T05:59:03.020 に答える