【问题标题】:How To Read A Specific Part Of A Line In A Text File In Java?如何在 Java 中读取文本文件中某一行的特定部分?
【发布时间】:2019-04-01 08:17:42
【问题描述】:

我有一个文本文件,我在其中逐行写了一些信息,如下所示:

name|Number|amount|PIN

如何以某种方式(例如)在方法中只使用“名称”部分来读回数据? 示例代码如下图所示。

【问题讨论】:

  • 遍历每一行并用分隔符分割
  • 提示未来的问题:将代码 sn-ps 发布为文本(您可以将其格式化为代码,如下面的答案所示),而不是屏幕截图。 1)它可以帮助那些会回答您的问题的人(复制粘贴代码的相关部分比从屏幕截图中重新键入它们更容易)。 2)它节省了一些带宽。 3) 在视觉上解析实际文本通常比(经常)对比度差的缩小图像更容易(尤其是不和谐,当用户为深色主题配置自定义站点样式并且屏幕截图是浅色主题 IDE 时)。

标签: java arrays filereader


【解决方案1】:

在开始时声明一个列表来收集帐户:

import java.util.ArrayList;
...

public Account[] inReader() { //BTW: why do you pass an Account[] here? 
ArrayList accountList = new ArrayList();
    ...
}

for(String records : dataRecords) {...} 替换为

String name = dataRecords[0];
String cardNumber = dataRecords[1];
int pin = Integer.parseInt(dataRecords[2]); //to convert the String back to int
double balance = Double.parseDouble(dataRecords[3]);

Account account = new Account(name, cardNumber, pin, balance);
accountList.add(account);

因为您已经逐条记录 (while ((line = br.readLine())!=null) {...})

到底return accountList.toArray(new Account[0]);

【讨论】:

    【解决方案2】:

    您可以逐行阅读文本,然后使用“|”分隔列的分隔符。

    try (Stream<String> stream = Files.lines(Paths.get(fileName))) {
            stream.forEach(System.out::println);
    }
    

    【讨论】:

      【解决方案3】:

      您可以逐行读取文件并在分隔符“|”处拆分。

      以下示例假定文件路径位于 args[0] 中,并且会读取然后输出输入的名称组件:

      public static void main(String[] args) {
          File file = new File(args[0]);
          BufferedReader br = new BufferedReader(new FileReader(file));
      
          while(String line = br.readLine()) != null) {
              String[] details = line.split("|");
              System.out.println(details[0]);
          }
      }
      

      【讨论】:

        【解决方案4】:

        正如上面评论中提到的,您可以简单地 split 分隔符上的行 |,然后从那里开始。

        类似:

        public class Account {
            // ...
            public static Account parseLine(String line) {
                String[] split = line.split("|");
                return new Account(split[0], split[1], split[2], split[3]);
            }
        }
        

        应该可以正常工作(假设您有一个构造函数,它接受您要放入的四件事)。如果您的Account 类有更多 信息,您可以创建一个AccountView 或类似名称的类,确实 只包含您在此处可用的详细信息。有了这个,只需逐行迭代,将您的行解析为这些Objects 之一,并在调用其他需要name 的方法时使用它的属性(包括已经可用的getter)等。

        【讨论】:

          【解决方案5】:

          首先,您需要逐行读取文件的全部内容。 然后,对于每一行,您需要创建一个函数以通过可配置的分隔符分割行文本。此函数可以接收列号,它应该返回所需的值。例如:extractData(line, 0) 应该返回 'name',extractData(line, 2) 应该返回 'amount' 等等。

          此外,您需要进行一些验证:如果只有 3 列而您期望 4 列怎么办?您可以抛出异常,也可以返回 null/empty。

          【讨论】:

            【解决方案6】:

            有很多可能的方法来做到这一点。其中之一是制作一个保存数据的对象。例如,既然您知道您的数据将始终包含名称、编号、金额和密码,那么您可以创建一个这样的类:

            public class MyData {
                private String name;
                private String number;
                private double amount;
                private String pin;
            
                // Add getters and setters below
            }
            

            然后在读取文本文件时,您可以列出MyData 并添加每个数据。你可以这样做:

            try {
                BufferedReader reader = new BufferedReader(new FileReader("path\file.txt"));
                String line = reader.readLine();
                ArrayList<MyData> myDataList = new ArrayList<MyData>();
                while (line != null) {
                    String[] dataParts = line.split("|"); // since your delimiter is "|"
                    MyData myData = new MyData();
                    myData.setName(dataParts[0]);
                    myData.setNumber(dataParts[1]);
                    myData.setAmount(Double.parseDouble(dataParts[2]));
                    myData.setPin(dataParts[3]);
                    myDataList.add(myData);
                    // read next line
                    line = reader.readLine();
            } catch (IOException e) {
                e.printStackTrace();
            }
            

            然后你可以像这样使用数据:

            myDataList.get(0).getName(); // if you want to get the name of line 1
            myDataList.get(1).getPin(); // if you want to get the pin of line 2
            

            【讨论】:

              【解决方案7】:

              您可以将文件转换为 csv 文件并使用专门用于读取 csv 文件的库,例如打开CSV。这将使您在处理文件中的数据时更加灵活。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2014-04-30
                • 2020-09-18
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-01-09
                相关资源
                最近更新 更多