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

从. txt文件读取字符串到二维数组;忽略引号中的空格;仅使用JDK

宋凌龙
2023-03-14

我经常访问这个网站,但我遇到了一些我无法回答的问题。这是类似于其他几个职位,在这里,但我还没有找到一个答案,我正在寻找。

需要注意的是,这是学校课程的一部分,目前这是一个更大的java项目的独立java类。目前,我无法编辑. txt文件,并且仅限于使用以下资源:

标准JDK资源

java.util.Scanner;
java.io.FileInputStream;
java.io.IOException;

使用以下列表:

john.doe    108de81c31bf9c622f76876b74e9285f    "dead man"  user
jane.doe    3e34baa4ee2ff767af8c120a496742b5    "dead woman"    admin
barney.rubble   a584efafa8f9ea7fe5cf18442f32b07b    "secret password"   mod
fred.flinstone  17b1b7d8a706696ed220bc414f729ad3    "R0ck3y business"   user
luke.skywalker  3adea92111e6307f8f2aae4721e77900    "usetheforce1234"   mod
leah.skywalker  0d107d09f5bbe40cade3de5c71e9e9b7    "saveme"    admin

每个条目由制表符分隔。

我当前的java代码如下:

public static void main(String[] args) throws IOException {
    FileInputStream credFile = null;           // File input 
    Scanner inFS = null;                       // Scanner object

    final int NUM_ROWS_CRED = 6;
    final int NUM_COLS_CRED = 4;
    String[][] credArray = new String[NUM_ROWS_CRED][NUM_COLS_CRED];
    int i = 0;                                 // Index variable
    int j = 0;                                 // Index variable

    // Import file data from file.txt
    credFile = new FileInputStream("file.txt");
    inFS = new Scanner(credFile);

    // Create array of file.txt
    for (i = 0; i < NUM_ROWS_CRED; ++i) {
        for (j = 0; j < NUM_COLS_CRED; ++j) {
            credArray[i][j] = inFS.next();
        }
    }

    // Output array to verify array stored correctly.
    for (i = 0; i < NUM_ROWS_CRED; ++i) {
        for (j = 0; j < NUM_COLS_CRED; ++j) {
            System.out.println(credArray[i][j] + " ");
        }
        System.out.println("");
    }

  credFile.close(); //Closes file.
}                          

我当前的输出如下:john。doe 108DE81C31BF9C622F7687B74E9285F“死人”

user 
jane.doe 
3e34baa4ee2ff767af8c120a496742b5 
"dead 

woman" 
admin 
barney.rubble 
a584efafa8f9ea7fe5cf18442f32b07b 

"secret 
password" 
mod 
fred.flinstone 

17b1b7d8a706696ed220bc414f729ad3 
"R0ck3y 
business" 
user 

luke.skywalker 
3adea92111e6307f8f2aae4721e77900 
"usertheforce1234" 
mod

预期输出:john.doe108de81c31bf9c622f76876b74e9285f"死人"用户

jane.doe
3e34baa4ee2ff767af8c120a496742b5
"dead woman"
admin

等等...

解决方案、指导、正确方向的指针都是受欢迎的。另外,请记住,我被严格限制不编辑。txt文件,并且只使用了JDK和列出的3个资源。非常感谢。

共有2个答案

越国源
2023-03-14

试试这个。

final int NUM_ROWS_CRED = 6;
final int NUM_COLS_CRED = 4;
String[][] credArray = new String[NUM_ROWS_CRED][NUM_COLS_CRED];
Pattern pat = Pattern.compile("\"[^\"]+\"|\\S+");
try (BufferedReader r = Files.newBufferedReader(Paths.get("file.txt"))) {
    for (int i = 0; i < NUM_ROWS_CRED; ++i) {
        Matcher m = pat.matcher(r.readLine());
        for (int j = 0; m.find() && j < NUM_COLS_CRED; ++j)
            credArray[i][j] = m.group();
    }
}
for (String[] row : credArray)
    System.out.println(Arrays.toString(row));

结果:

[john.doe, 108de81c31bf9c622f76876b74e9285f, "dead man", user]
[jane.doe, 3e34baa4ee2ff767af8c120a496742b5, "dead woman", admin]
[barney.rubble, a584efafa8f9ea7fe5cf18442f32b07b, "secret password", mod]
[fred.flinstone, 17b1b7d8a706696ed220bc414f729ad3, "R0ck3y business", user]
[luke.skywalker, 3adea92111e6307f8f2aae4721e77900, "usetheforce1234", mod]
[leah.skywalker, 0d107d09f5bbe40cade3de5c71e9e9b7, "saveme", admin]
越涛
2023-03-14

你熟悉正则表达式吗?它们是解决你问题的关键。

与@cricket_007一样,默认的扫描器分隔符是空白。这就是为什么扫描器会将引用的令牌分开,我相信这是您希望扫描器不要做的事情。因此,您必须通知扫描器如何分割输入令牌。

在一行中,标记由制表符分隔,行由换行符分隔。因此,您可以这样指示扫描仪:

inFS.useDelimiter("[\\t\\R]");

这样,扫描器将给出引用的令牌作为一个整体。此正则表达式意味着拆分由制表符或任何换行符分隔的标记。模式Javadoc

如果输入中没有换行符,则正则表达式更简单:

inFS.useDelimiter("\\t");

如果不允许使用正则表达式,则必须找到另一种方法来处理带引号的标记。

 类似资料:
  • 我有一个txt文件,我正试图用扫描仪类读取它。 我正在使用一个double for循环来读取文件,并在其上读取到一个2D数组。 该文件如下所示: 3 3。R#。.#。.# 第一行分别是2D数组的长度和宽度。 3 3 1 0 1 1 1 0 0 1 我在这里使用的方法如下所示: 我希望这与使用char而不是int时的工作方式相同。

  • 正如标题所说,我想知道在Java中是否有使用数组格式化字符串的简便方法。 让我举一个kotlin的例子。 以上代码运行良好。那么Java呢? 对不起,我没有清楚地描述我的问题。当我遇到我的真实案例时,我发现我的代码现在无法工作。 事实上,模板是从文件中读取的。 和模板。txt文件包含: 如您所见,我想读取文件,然后格式化结果。 另外,对于这个问题我很抱歉。因为它似乎被更改为如何格式化从文件中读取的

  • 问题内容: 如何从字符串读取numpy数组?采取类似的字符串: 并将其转换为数组: 在哪里成为对象: 更新 : 我正在寻找一个非常简单的界面。一种将2D数组(浮点数)转换为字符串,然后将其读回以重建数组的方法: 应该回来 应该返回对象 理想的情况是,如果有一个用来控制将浮点精度转换为字符串的精度参数,那么您就不会得到像这样的条目。 在numpy的文档中我找不到任何可以同时完成这两种操作的文档。可让

  • 所以,我试图让我的程序从文本文件中读入一个结构数组,它编译得很好,但看起来并没有真正读入值?...我不知道为什么。这是代码的相关部分: 这是txt文件(标题:Planets.txt) 水星120 50 500 12.1 30 2金星120 50 500 29.1 30 6地球120 50 500 32.2 30 7月亮120 15 50 5.3 30 2火星120 50 500 12.2 30 4

  • 问题内容: 我正在寻找正则表达式以在Java中执行以下操作: 一些测试用例: 我遇到的一些摘要: 谢谢! 问题答案: String stringToSplit = This is the string to split; 在这种情况下,结果将为“ This”,“ is”,“ the”,“ string ”,“ split”。 此时您可以 在哪里等于“ This”,依此类推… 希望这可以帮助。

  • 问题内容: 嗨,我想读取N行的txt文件,并将结果放入字符串数组中。 问题答案: 使用和。