在 .txt 文件中搜索字符串并获取 Java 中的行号和列号
Searching for a String in a .txt file and getting the row and column number in Java
我目前遇到了一个问题。我应该编写一个程序,能够在作为参数给出的 .txt 文件中搜索字符串。程序必须 return 找到的字符串的行和列。
我正在努力寻找一种方法来实现这一目标,但不知道如何继续下去。我会很高兴收到你的来信。
这是我处理任务的尝试:
- 我考虑过通过缓冲 reader 将文件内容保存在字符串数组中,但这似乎不起作用,因为我无法从一开始就定义数组的长度
- 我还考虑过通过缓冲的 reader 将文件内容保存在一个字符串中,然后将这个字符串拆分为字符。但是我不确定我将如何能够检索原始文件中的行。
这是我目前的非功能代码:
public class StringSearch{
public static void main(String[] args){
if(args.length > 0){
BufferedReader br = null;
String text = null;
try{
br = new BufferedReader(new FileReader(args[0]));
// attempt of saving the content of the "argument" file in a string array and then in a string
String[] lines = new String[]; // I know this does not work like this
for( int i = 0; i < lines.length; i++){
lines[i] = br.readLine;
text = text + lines[i];
i++;
}
text.split("\r\n");
} catch (IOException ioe){
ioe.printStackTrace();
} finally{
if (br != null) {
try{
br.close();
}catch (IOException ioe){
ioe.printStackTrace();
}
}
}
}
}
}
这是一种方法 -
- 让我们考虑一个计数器,它为所有
readLine()
方法调用 - 表示 .txt 中的 "row"
文件。因此,在每次调用 readLine 后递增计数器
while 循环。
- 接下来,拆分“” (space) 上的行以获得
线。然后,您可以遍历此数组并将单词匹配到
搜索字符串。匹配时数组索引的位置
被发现将代表"column".
您可以按照以下方式进行:
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
if (args.length != 2) {
System.out.println("The correct syntax to use this program is: java Main <filename.txt> <text-to-search>");
return;
}
Scanner scanner;
File file = new File(args[0]);
int rowCount = 1, index;
String line;
// Map to collect row and col info of the search string
Map<String, String> lineColMap = new HashMap<String, String>();
if (!file.exists()) {
System.out.println("The file, " + args[0] + " does not exist");
return;
}
try {
scanner = new Scanner(file);
while (scanner.hasNextLine()) {// Loop until the last line in the file
line = scanner.nextLine();// Read a line from the file
index = line.indexOf(args[1]);// Find if the string exists in the line
if (index != -1) {// If the string exists
// Put the row and col info of the search string into the map
lineColMap.put("Row: " + rowCount, "Column: " + index);
}
rowCount++;// Increase the row count
}
} catch (Exception e) {
System.out.println("Error occured while processing the file");
e.printStackTrace();
}
if (lineColMap.entrySet().size() > 0) {// If there is at least one entry collected into the map
System.out.println("'" + args[1] + "' exists in " + args[0] + " as follows:");
for (Map.Entry<String, String> entry : lineColMap.entrySet()) {
System.out.println(entry.getKey() + ", " + entry.getValue());
}
} else {
System.out.println("'" + args[1] + "' does not exist in " + args[0]);
}
}
}
样本 运行: java Main input.txt of
'of' exists in input.txt as follows:
Row: 1, Column: 51
Row: 2, Column: 50
Row: 3, Column: 50
Row: 5, Column: 71
input.txt
内容如下:
Stack Overflow is a question and answer site for professional and enthusiast programmers.
It is a privately held website, the flagship site of the Stack Exchange Network, created in 2008 by Jeff Atwood and Joel Spolsky.
It features questions and answers on a wide range of topics in computer programming.
It was created to be a more open alternative to earlier question and answer sites such as Experts-Exchange.
The name for the website was chosen by voting in April 2008 by readers of Coding Horror, Atwood's popular programming blog.
代码逻辑通俗易懂,相信第一次看你应该能看懂。如有任何疑问,请随时发表评论。
我目前遇到了一个问题。我应该编写一个程序,能够在作为参数给出的 .txt 文件中搜索字符串。程序必须 return 找到的字符串的行和列。 我正在努力寻找一种方法来实现这一目标,但不知道如何继续下去。我会很高兴收到你的来信。
这是我处理任务的尝试: - 我考虑过通过缓冲 reader 将文件内容保存在字符串数组中,但这似乎不起作用,因为我无法从一开始就定义数组的长度 - 我还考虑过通过缓冲的 reader 将文件内容保存在一个字符串中,然后将这个字符串拆分为字符。但是我不确定我将如何能够检索原始文件中的行。
这是我目前的非功能代码:
public class StringSearch{
public static void main(String[] args){
if(args.length > 0){
BufferedReader br = null;
String text = null;
try{
br = new BufferedReader(new FileReader(args[0]));
// attempt of saving the content of the "argument" file in a string array and then in a string
String[] lines = new String[]; // I know this does not work like this
for( int i = 0; i < lines.length; i++){
lines[i] = br.readLine;
text = text + lines[i];
i++;
}
text.split("\r\n");
} catch (IOException ioe){
ioe.printStackTrace();
} finally{
if (br != null) {
try{
br.close();
}catch (IOException ioe){
ioe.printStackTrace();
}
}
}
}
}
}
这是一种方法 -
- 让我们考虑一个计数器,它为所有
readLine()
方法调用 - 表示 .txt 中的 "row" 文件。因此,在每次调用 readLine 后递增计数器 while 循环。 - 接下来,拆分“” (space) 上的行以获得 线。然后,您可以遍历此数组并将单词匹配到 搜索字符串。匹配时数组索引的位置 被发现将代表"column".
您可以按照以下方式进行:
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
if (args.length != 2) {
System.out.println("The correct syntax to use this program is: java Main <filename.txt> <text-to-search>");
return;
}
Scanner scanner;
File file = new File(args[0]);
int rowCount = 1, index;
String line;
// Map to collect row and col info of the search string
Map<String, String> lineColMap = new HashMap<String, String>();
if (!file.exists()) {
System.out.println("The file, " + args[0] + " does not exist");
return;
}
try {
scanner = new Scanner(file);
while (scanner.hasNextLine()) {// Loop until the last line in the file
line = scanner.nextLine();// Read a line from the file
index = line.indexOf(args[1]);// Find if the string exists in the line
if (index != -1) {// If the string exists
// Put the row and col info of the search string into the map
lineColMap.put("Row: " + rowCount, "Column: " + index);
}
rowCount++;// Increase the row count
}
} catch (Exception e) {
System.out.println("Error occured while processing the file");
e.printStackTrace();
}
if (lineColMap.entrySet().size() > 0) {// If there is at least one entry collected into the map
System.out.println("'" + args[1] + "' exists in " + args[0] + " as follows:");
for (Map.Entry<String, String> entry : lineColMap.entrySet()) {
System.out.println(entry.getKey() + ", " + entry.getValue());
}
} else {
System.out.println("'" + args[1] + "' does not exist in " + args[0]);
}
}
}
样本 运行: java Main input.txt of
'of' exists in input.txt as follows:
Row: 1, Column: 51
Row: 2, Column: 50
Row: 3, Column: 50
Row: 5, Column: 71
input.txt
内容如下:
Stack Overflow is a question and answer site for professional and enthusiast programmers.
It is a privately held website, the flagship site of the Stack Exchange Network, created in 2008 by Jeff Atwood and Joel Spolsky.
It features questions and answers on a wide range of topics in computer programming.
It was created to be a more open alternative to earlier question and answer sites such as Experts-Exchange.
The name for the website was chosen by voting in April 2008 by readers of Coding Horror, Atwood's popular programming blog.
代码逻辑通俗易懂,相信第一次看你应该能看懂。如有任何疑问,请随时发表评论。