2

我正在尝试使用标记器将 .txt 文件的内容插入到向量中;但是没有插入特定文件。稍后我需要稍后将向量的内容传递给jtable。问题是.txt的第一行有空值,所以它没有被插入它跳过第一行并继续前进..是有没有办法在向量中存储 null 并用 " " 替换它?

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

测试文件记录:第一行有两个空值列

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) {
    ....
}

使用变量。因为if (tokenizer.nextToken() == null) { vec.add(tokenizer.nextToken()); }将使用两个令牌。一个用于测试,一个用于添加,使整个测试变得毫无意义和损坏。

它不会因为它更短而更快。初学者错误,试图通过少写来优化代码。

于 2012-06-03T01:22:51.123 回答
0

为什么要使用 Vector?考虑 List,因为它将保持顺序。有多种方法可以替换空字符串来代替 null。如果您只想从代码中的一个位置添加对象,那么Tom提到的将起作用。如果有多个地方,甚至扩展 Vector 并覆盖 add 或拥有方便的方法将最小化一个地方的检查

于 2012-06-02T05:59:03.020 回答