我想从文本文件中读取特定字符串并将它们存储在Excel工作表中

时间:2014-06-06 05:29:10

标签: java string excel poi-hssf

我的文本文件包含这样的行

FLTR TID:0000003756 RPC ID:0000108159 USER: Remedy Application Service

FLTR TID:0000003756 RPC ID:0000108159 USER: Remedy Application Service

FLTR TID:0000003756 RPC ID:0000108159 USER: ibsdr

FLTR TID:0000003756 RPC ID:0000108159 USER: Vinay.k@in.uni.com

FLTR TID:0000003756 RPC ID:0000108159 USER: Vinay.k@in.uni.com

FLTR TID:0000003756 RPC ID:0000108159 USER: wsdl

FLTR TID:0000003756 RPC ID:0000108159 USER: stefan.hummel@uni.com

我希望以列方式在Excel工作表中存储突出显示的单词,并且我只想存储唯一的用户名..例如:

列1 ....的列2

S.NO ...........的用户名

1 .................. 补救应用服务

2 ..................的 ibsdr

第3 ..................的 Vinay.k@in.uni.com

4 ..................的 WSDL

5 ..................的 stefan.hummel@uni.com

这就是我试过的

public class User {

    static HSSFWorkbook hwb = new HSSFWorkbook();
    static HSSFSheet sheet = hwb.createSheet("new sheet");
    static HSSFRow rowhead = sheet.createRow((short) 0);
    static HSSFRow row = sheet.createRow((short) 1);
    static int count = 1;

    public static void main(String [] args) {
        try {
            rowhead.createCell((short) 0).setCellValue("SNo");
            rowhead.createCell((short) 1).setCellValue("USER NAME");
            BufferedReader br = new BufferedReader(new FileReader("filter.log"));
            String str = null;
            String user = null;
            while ((str = br.readLine()) != null) {
                if (str.contains("FLTR")) {
                    user = str.substring(48, 75); // This is to get user names
                    count++;
                    store(user, count);
                }
            }
            FileOutputStream fileOut = new FileOutputStream("D:/Excel.xls");
            hwb.write(fileOut);
            fileOut.close();
            System.out.println("Your excel file has been generated!");
        }
        catch (Exception ex) {
            System.out.println(ex);
        }
    }

    private static void store(String user, int count) {
        row.createCell((short) 0).setCellValue(count);
        row.createCell((short) 1).setCellValue(user);
    }
}

输出

S.NO .......用户名

17963 ......补救申请服务

在这个每当我执行这个程序时,只有第一个值被存储,而不是所有的值都存储..我想在这个Excel工作表中只存储 UNIQUE用户名 ..

请帮助我,提前谢谢

4 个答案:

答案 0 :(得分:1)

首先,我不是专家,我自己也从未尝试过,也不能。通过查看代码,我可以发现一些可能导致问题的设计缺陷。

您只需声明一行:

static HSSFRow row= sheet.createRow((short)1);

这意味着在您的store方法中,将反复写入相同行的单元格。您缺少的是在遇到唯一名称时创建新行的逻辑。对于此任务,我是否可以建议使用Set,最好使用散列操作以获得较低的查找时间,并在其中存储所有唯一名称?这样您就可以使用简单的contains查询。

此外,您的count变量已关闭并从2开始计数,而不是从1开始计数。将其初始化为0或在使用后递增。

一些伪代码:

private HashSet<String> names = new HashSet<>();
// More fields here.

// Now start in your if clause:
if(str.contains("FLTR" && !names.contains(str.substring(48))
{
    store(user, count);
    count++;
    names.add(str.substring(48));
}

// More of your code.

private static void store(String user, int count)
{
    // Create new row
    HSSFRow row = sheet.createRow((short)rowCount);
    rowCount++;


    row.createCell((short) 0).setCellValue(count);
    row.createCell((short) 1).setCellValue(user);
}

答案 1 :(得分:1)

  • 对于唯一名称,您可以使用ArrayList<String>添加,只要新的UserName出现添加,在此之前检查用户是否存在于arrayList中或不是(通过使用 contains("UName") 然后继续。
  • 使用String username=line.substring(line.lastindexOf(":")).trim();或您可以使用line.split(":")[1].trim();

对于Excel行创建,您可以使用循环。

int i=0;
while((str=br.readLine())!=null){
row = sheet.createRow((short) i);
cell = row.createCell(i);
cell.setCellValue("UserName");//Set UserName after getting it from 'str'
i++;
}

答案 2 :(得分:0)

我建议您进行两项改进,以便更轻松地解决您的问题。

1)不要尝试使用Java写入Excel工作表,这有点复杂。相反,您可以写入CSV文件。您可以从外部打开此CSV文件并另存为Excel。

2)以下行可能会导致修改用户名:

 user=str.substring(48,75);   // This is to get user names

相反,您可以使用

user=str.substring(48);   // This is to get user names

因此,编写CSV不需要Excel库,也可以在excel工作簿中打开它。 :)

答案 3 :(得分:0)

公共类UniqueUSER {

static HSSFWorkbook hwb = new HSSFWorkbook();

static HSSFSheet sheet = hwb.createSheet(&#34; new sheet&#34;);

public static void main(String [] args)抛出IOException

{

HSSFRow行;

HashSet names = new HashSet&lt;&gt;();

BufferedReader br = new BufferedReader(new FileReader(&#34; simle.log&#34;));

PrintStream out = new PrintStream(&#34; D:/Excel.xls");

String str = null;

int count = 0;

而((STR = br.readLine())!= NULL) {

如果(str.contains(&#34; FLTR&#34))

{

String user = str.substring(97,135);

计数++;

names.add(用户);

HSSFRow row1 = sheet.createRow((short)count);

row1.createCell((short)0)。setCellValue(&#34; names&#34;);

}

}

Iterator itr = names.iterator();

而(itr.hasNext()) {

out.println(itr.next());  

}

}

}