当前位置: 首页 > 知识库问答 >
问题:

将数据从非常大的文本文件导入JTable

国兴文
2023-03-14

我正在制作一个应用程序,它处理存储在文本文件中的大量数据。本质上,应用程序浏览一个. txt文件,一旦找到,应用程序需要把文件中的所有数据放入JTable,然后我需要对数据执行一些过滤操作,然后将其导出。. txt文件中的数据格式如下:

Column1 Column2 Column3 Column4 Column5 Column6 .........(there are 510 columns)
A       B       C       D       E       F 
G       H       I       J       K       L
....   ...     ...     ...    ....     ...

有数千行。每行由双类型数字组成(A、B……均为1.3、2.0等)

我通过手动添加数组中的所有列名,然后将表的模型设置为

table = new JTable();
table.setModel(new DefaultTableModel(null,columns)); 
//'columns' is a string array containing 510 names 

我已经把行作为'空'在这里,因为我不知道我应该如何得到数据,并将其转换为2D数组,因为这是行的格式。此外,可能存在任意数量的行。我如何读取文本文件的代码如下:

    btnBrowse.addActionListener(new ActionListener() 
    {
        public void actionPerformed(ActionEvent arg0) 
        {                       
            JFileChooser chooser = new JFileChooser();

            int option = chooser.showOpenDialog(dpaGUI.this);               
            if (option == JFileChooser.APPROVE_OPTION) 
            {
              file = chooser.getSelectedFile();
              BufferedReader in = null;
            try 
            {
                in = new BufferedReader(new FileReader(file));
            } catch (FileNotFoundException e) 
            {
                e.printStackTrace();
            }

              try 
              {
                while(in.ready())
                  {
                    //test operations performed with the retrieved text
                  }
            } 
              catch (IOException e) 
            {

                e.printStackTrace();
            }
              try 
              {
                in.close();
            } catch (IOException e) 
            {
                e.printStackTrace();
            }
            }
        }
    });  

我试着执行一些测试操作,比如用“\t”分割检索到的文本(这就是它存储在文本文件中的方式),但到目前为止没有任何帮助。文本文件还包含列的名称,因此在填充行时需要删除这些列。任何关于如何将文本文件中的海量数据导入JTable的建议都会有所帮助。我使用JTable是因为我需要对整列数据(每列有数千行)执行进一步的操作。我愿意接受不同容器的建议。任何建议都会有帮助。谢谢!

共有2个答案

岳佐
2023-03-14

如果您认为数据集太大,请尝试实现您自己的单元模型,而不是从AbstractTableModel派生。面向模型的方法的强大之处在于,只会从模型中请求总行数和屏幕上当前可见的单元格。因此,行数可能超过计算机内存的容量。最好使用数据库引擎作为后端。

齐典
2023-03-14

试试这个。您可以使用接受列名和行数的构造函数,而不是将数据设置为null。将行设置为0,只需使用addRow

DefaultTableModel(Object[] cols, int rows)

请参阅DefaultTableModelAPI中的更多方法和构造函数。

使用您的特定代码,您可以使用我的方法创建DefaultTableModel和use表。在您的ActionListener中设置模型(模型)

文件

Column1 Column2 Column3 Column4 Column5 Column6 
A       B       C       D       E       F 
G       H       I       J       K       L
A       B       C       D       E       F 
G       H       I       J       K       L
A       B       C       D       E       F 
G       H       I       J       K       L
A       B       C       D       E       F 
G       H       I       J       K       L
A       B       C       D       E       F 
G       H       I       J       K       L
A       B       C       D       E       F 
G       H       I       J       K       L

后果

密码

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;

public class TestTable5 {

    public TestTable5() {
        DefaultTableModel model = createModel("/resources/file.txt");
        JTable table = new JTable(model);

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new JScrollPane(table));
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private DefaultTableModel createModel(String filePath) {
        DefaultTableModel model = null;

        try {
            BufferedReader txtReader = new BufferedReader(
                    new InputStreamReader(getClass().getResourceAsStream(filePath)));
            String header = txtReader.readLine();
            model = new DefaultTableModel(header.split("\\s+"), 0);
            String line;
            while((line = txtReader.readLine()) != null) {
                model.addRow(line.split("\\s+"));
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }

        return model;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new TestTable5();
            }
        });
    }
}

您可以尝试使用JFileChooser

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;

public class TestTable5 {

    public TestTable5() {
        String[] defaultCols = {"COL", "COL", "COL", "COL", "COL", "COL"};
        DefaultTableModel model = new DefaultTableModel(defaultCols, 0);
        JTable table = new JTable(model);

        JButton button = createButton(table);
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( new JScrollPane(table));
        frame.add(button, BorderLayout.SOUTH);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private JButton createButton(final JTable table) {
        JButton button = new JButton("Get File");
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                JFileChooser chooser = new JFileChooser();
                int result = chooser.showOpenDialog(table);
                if (result == JFileChooser.APPROVE_OPTION) {
                    File file = chooser.getSelectedFile();
                    DefaultTableModel model = createModel(file);
                    table.setModel(model);
                }
            }
        });
        return button;
    }

    private DefaultTableModel createModel(File file) {
        DefaultTableModel model = null;

        try {
            BufferedReader txtReader = new BufferedReader(
                    new FileReader(file));
            String header = txtReader.readLine();
            model = new DefaultTableModel(header.split("\\s+"), 0);
            String line;
            while ((line = txtReader.readLine()) != null) {
                model.addRow(line.split("\\s+"));
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }

        return model;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new TestTable5();
            }
        });
    }
}

 类似资料:
  • 我正在阅读一个用一些分隔符分隔的文本文件。 我的文本文件内容示例 Avc def efg JKSJD 1 2 3 5 3 4 6 0 每次调用createRow和createCell时是否都会创建新对象? 如果是,有什么替代方案?。如何以更好的性能将大数据写入excel?

  • 我有一个1.5GB.dat文件需要作为pandas数据帧导入,我遇到了内存问题(8GB RAM)。如何将dat文件分解成块来执行分析?

  • 问题内容: 有没有办法将数据从JSON文件导入R?更具体地说,该文件是带有字符串字段,对象和数组的JSON对象的数组。关于如何处理此http://cran.r-project.org/web/packages/rjson/rjson.pdf,RJSON软件包尚不清楚。 问题答案: 首先安装软件包: 然后: 更新: 从0.2.1版本开始

  • 我对Java非常陌生,因此遇到了很大的困难。这是我想做的,但似乎不太奏效。 请看附上的Java代码和文本文件(截图在链接)。 文本文件:

  • 想要知道更多东西吗?当你需要从表中查找某些值时,可以使用冗长的 case 语句或 selectors 实现,但更整洁的方式是使用 extlookup 函数实现。 在 puppetmaster 上可以使用 extlookup 函数查询外部的 CSV 文件,并返回匹配的数据片段。 将所有数据组织到一个单一的文件并将它从 Puppet 配置清单中分离出来, 可以使维护工作变得更简单,也便于与其他人分享:

  • 问题内容: 我想将包含字符串的巨大文件拆分为一组新的(较小)文件,并尝试使用nio2。 我不想将整个文件加载到内存中,因此我尝试了BufferedReader。 较小的文本文件应受文本行数的限制。 该解决方案有效,但是我想问一问,是否有人知道使用usion java 8(也许是带有stream()-api的lamdas)和nio2具有更好的性能的解决方案: 问题答案: 注意/ 及其子类的直接使用与