我的文本文件包含这样的行
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用户名 ..
请帮助我,提前谢谢
答案 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());
}
}
}