我还在学习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;
}
};
简单地说,我希望将所有“表”加到数组数组(或任何类似的变量),然后将其显示为表。如果有人知道任何解决方案或者可以链接任何类似的计算,那就太棒了!
答案 0 :(得分:1)
我从该位置获取了所有january1 january2...
个文件,并使用相同的函数计算要存储的值。
然后我创建了一个包含两个标题的表Day
和Number
。然后根据生成的值添加行。
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)
所以,正如我所看到的那样,你有四个问题需要回答,这与提出问题的网站礼节相违背,但会有所帮助
JTable
。列出文件的最简单方法可能是使用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;
}
}