JAVA读取文本文件,计算数字并将其写入Jtable

时间:2015-06-04 11:45:11

标签: java swing file-io jtable

我还在学习JAVA,并且几天来一直试图找到我的程序的解决方案,但我还没有解决它。

我有很多文本文件(我的程序保存)。文件如下所示:

text (tab) number (tab) number (tab)...
text (tab) number (tab) number (tab)...

(tab)表示有制表标记, text意味着是文本(字符串), number表示有数字(整数)。

文件数量可以从1到32,文件名称如下:january1; january2; january3 ...

我需要阅读所有这些文件(忽略字符串),并且只汇总这样的数字:

while ((line = br.readLine()) != null) {

    counter=counter+1;
    String[] info = line.split("\\s+");

    for(int j = 2; j < 8; j++) {

        int num = Integer.parseInt(info[j]);
        data[j][counter]=data[j][counter]+num;

    }

};

简单地说,我希望将所有“表”加到数组数组(或任何类似的变量),然后将其显示为表。如果有人知道任何解决方案或者可以链接任何类似的计算,那就太棒了!

4 个答案:

答案 0 :(得分:1)

我从该位置获取了所有january1 january2...个文件,并使用相同的函数计算要存储的值。

然后我创建了一个包含两个标题的表DayNumber。然后根据生成的值添加行。

DefaultTableModel model = new DefaultTableModel();
JTable table = new JTable(model);
String line;

model.addColumn("Day");
model.addColumn("Number");
BufferedReader br = null;
model.addRow(new Object[]{"a","b"});

for(int i = 1; i < 32; i++)
{
try {

    String sCurrentLine;
    String filename = "january"+i;
    br = new BufferedReader(new FileReader("C:\\january"+i+".txt"));
    int counter = 0;
    while ((sCurrentLine = br.readLine()) != null) {
        counter=counter+1;
        String[] info = sCurrentLine.split("\\s+");
        int sum = 0;
        for(int j = 2; j < 8; j++) {

            int num = Integer.parseInt(info[j]);
            sum += num;

        }
        model.addRow(new Object[]{filename, sum+""});

    }

} catch (IOException e) {
    e.printStackTrace();
} finally {
    try {
        if (br != null)br.close();
    } catch (IOException ex) {
        ex.printStackTrace();
    }
    }
}
JFrame f = new JFrame();
f.setSize(300, 300);
f.add(new JScrollPane(table));
f.setVisible(true);

答案 1 :(得分:1)

所以,正如我所看到的那样,你有四个问题需要回答,这与提出问题的网站礼节相违背,但会有所帮助

  1. 如何列出一系列文件,大概是使用某种过滤器
  2. 如何以有意义的方式阅读文件和处理数据
  3. 如何管理数据结构中的数据
  4. JTable
  5. 显示数据

    列出文件

    列出文件的最简单方法可能是使用File#list并传递符合您需求的FileFilter

    File[] files = new File(".").listFiles(new FileFilter() {
        @Override
        public boolean accept(File pathname) {
            return pathname.getName().toLowerCase().startsWith("janurary");
        }
    });
    

    现在,我编写了一个方法,该方法使用File对象表示要列出的目录,并使用FileFilter来搜索它...

    public File[] listFiles(File dir, FileFilter filter) throws IOException {
        if (dir.exists()) {
            if (dir.isDirectory()) {
                return dir.listFiles(filter);
            } else {
                throw new IOException(dir + " is not a valid directory");
            }
        } else {
                throw new IOException(dir + " does not exist");
        }
    }
    

    通过这种方式,您可以根据不同的FileFilter搜索多个不同的文件集。

    当然,您也可以使用较新的Paths/Files API来查找文件

    阅读文件......

    阅读多个文件归结为同一件事,阅读单个文件......

    // BufferedReader has a nice readline method which makes
    // it easier to read text with.  You could use a Scanner
    // but I prefer BufferedReader, but that's me...
    try (BufferedReader br = new BufferedReader(new FileReader(new File("...")))) {
        String line = null;
        // Read each line
        while ((line = br.readLine()) != null) {
            // Split the line into individual parts, on the <tab> character
            String parts[] = line.split("\t");
            int sum = 0;
            // Staring from the first number, sum the line...
            for (int index = 1; index < parts.length; index++) {
                sum += Integer.parseInt(parts[index].trim());
            }
            // Store the key/value pairs together some how
        }
    }
    

    现在,我们需要一些方法来存储计算结果......

    有关详细信息,请查看Basic I/O

    管理数据

    现在,有许多方法可以做到这一点,但由于数据量是可变的,您需要一个可以动态增长的数据结构。

    我的第一个想法是使用Map,但这假设您想要组合具有相同名称的行,否则您应该只在List内使用List,其中外部List表示行,Inner列表表示列值...

    Map<String, Integer> data = new HashMap<>(25);
    File[] files = listFiles(someDir, januraryFilter);
    for (File file : files {
        readFile(file, data);
    }
    

    readFile基本上是之前的代码

    protected void readData(File file, Map<String, Integer> data) throws IOException {
        try (BufferedReader br = new BufferedReader(new FileReader(file))) {
            String line = null;
            // Read each line
            while ((line = br.readLine()) != null) {
                //...
                // Store the key/value pairs together some how
                String name = parts[0];
                if (data.containsKey(name)) {
                    int previous = data.get(name);
                    sum += previous;
                }
                data.put(name, sum);
            }
        }
    }
    

    有关详细信息,请查看Collections Trail

    显示数据

    最后,我们需要显示数据。您可以简单地使用DefaultTableModel,但您已经拥有结构中的数据,为什么不将其与自定义TableModel重复使用

    public class SummaryTableModel extends AbstractTableModel {
    
        private Map<String, Integer> data;
        private List<String> keyMap;
    
        public SummaryTableModel(Map<String, Integer> data) {
            this.data = new HashMap<>(data);
            keyMap = new ArrayList<>(data.keySet());
        }
    
        @Override
        public int getRowCount() {
            return data.size();
        }
    
        @Override
        public int getColumnCount() {
            return 2;
        }
    
        @Override
        public Class<?> getColumnClass(int columnIndex) {
            Class type = Object.class;
            switch (columnIndex) {
                case 0:
                    type = String.class;
                    break;
                case 1:
                    type = Integer.class;
                    break;
            }
            return type;
        }
    
        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
            Object value = null;
            switch (columnIndex) {
                case 0:
                    value = keyMap.get(rowIndex);
                    break;
                case 1:
                    String key = keyMap.get(rowIndex);
                    value = data.get(key);
                    break;
            }
            return value;
        }
    
    }
    

    然后您只需将其应用于JTable ...

    add(new JScrollPane(new JTable(new SummaryTableModel(data)));
    

    请查看How to Use Tables了解详情

    结论

    在问题的背景下,必须做出许多假设;文件的顺序是否重要?你关心重复的条目吗?

    因此,几乎不可能提供一个能够解决所有问题的“答案”

答案 2 :(得分:0)

使用Labled Loop和Try-Catch。下面的部分会在一行中添加所有数字。

你可以从这里得到一些提示:

String line = "text 1   2   3   4   del";
String splitLine[] = line.split("\t");
int sumLine = 0;
int i = 0;

contSum: for (; i < splitLine.length; i++) {
    try {
        sumLine += Integer.parseInt(splitLine[i]);
    } catch (Exception e) {
        continue contSum;
    }
}
System.out.println(sumLine);

答案 3 :(得分:0)

这是另一个使用矢量的例子。在此示例中,将搜索目录中的“.txt”文件并将其添加到JTable中。

doIt方法将接收文本文件所在的文件夹。 这将随着递归,在文件夹中查找文件。 找到的每个文件将按照示例文件进行拆分和添加。

public class FileFolderReader
{
  private Vector<Vector> rows = new Vector<Vector>();


  public static void main(String[] args)
  {
    FileFolderReader fileFolderReader = new FileFolderReader();
    fileFolderReader.doIt("D:\\folderoffiles");

  }

  private void doIt(String path)
  {
    System.out.println(findFile(new File(path)) + " in total");
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    Vector<String> columnNames = new Vector<String>();
    columnNames.addElement("File Name");
    columnNames.addElement("Size");

    JTable table = new JTable(rows, columnNames);

    JScrollPane scrollPane = new JScrollPane(table);
    frame.add(scrollPane, BorderLayout.CENTER);
    frame.setSize(300, 150);
    frame.setVisible(true);
  }

  private int findFile(File file)
  {
    int totalPerFile = 0;
    int total = 0;
    File[] list = file.listFiles(new FilenameFilter()
    {
      public boolean accept(File dir, String fileName)
      {
        return fileName.endsWith(".txt");
      }
    });
    if (list != null)
      for (File textFile : list)
      {
        if (textFile.isDirectory())
        {
          total = findFile(textFile);
        }
        else
        {
          totalPerFile = scanFile(textFile);
          System.out.println(totalPerFile + " in " + textFile.getName());
          Vector<String> rowItem = new Vector<String>();
          rowItem.addElement(textFile.getName());
          rowItem.addElement(Integer.toString(totalPerFile));
          rows.addElement(rowItem);
          total = total + totalPerFile;
        }
      }
    return total;
  }

  public int scanFile(File file)
  {
    int sum = 0;
    Scanner scanner = null;
    try
    {
      scanner = new Scanner(file);

      while (scanner.hasNextLine())
      {
        String line = scanner.nextLine();
        String[] info = line.split("\\s+");
        int count = 1;
        for (String stingInt : info)
        {
          if (count != 1)
          {
            sum = sum + Integer.parseInt(stingInt);
          }
          count++;
        }
      }
      scanner.close();
    }
    catch (FileNotFoundException e)
    {
      // you will need to handle this
      // don't do this !
      e.printStackTrace();
    }
    return sum;
  }
}