Java动态列标题

标签 java dynamic header

我有一个要求,我需要进行一些 Java 调用并检索必要的值。这些都是字符串。我需要将其写入带有逗号分隔值的控制台。如下所示:

3,Till,,Till,Weiss,,
3,ugilad,,ugilad,ugilad,,
3,admintest,,admin,test,abc@sample.com,

预期应该是:

userid,firstname,lastname,email
3,Till,,Till,Weiss,,
3,ugilad,,ugilad,ugilad,,
3,admintest,,admin,test,abc@sample.com,

现在我需要向这些值添加列。像这样说:userId、firstName、lastName。如何使用 Java 代码动态实现这一点?这是我编写的代码:

                if (usersList.totalCount != 0 && usersList.totalCount >= 1) {
                System.out.println("usersList.totalCount ----->"
                        + usersList.totalCount);
                for (KalturaUser user : usersList.objects) {
                    if (user != null) {
                        if (user.id != null) {
                            String userRole = getUserRole(user.id);
                            String cnum = getUserUniqueId(user.email);
                            // if (userRole != null) {
                            // if (userRole.equals("adminRole")
                            // || userRole
                            // .equals("privateOnlyRole")) {
                            // sb1.append(action);

                            if (user.id != null) {
                                sb.append(user.id);
                            } else {
                                sb.append(",");
                            }
                            String action = "1";

                            if (cnum != null) {
                                if (userRole == null) {
                                    action = "3";
                                }
                            } else {
                                action = "3";
                            }
                            if (action != null) {
                                sb1.append(action);
                            }
                            if (cnum != null) {
                                sb1.append(",").append(cnum);
                            } else {
                                sb1.append(",").append(user.id);
                                sb1.append(",");
                            }

                            if (user.firstName != null) {
                                sb.append(",").append(user.firstName);
                                sb1.append(",").append(user.firstName);
                            } else {
                                sb.append(",");
                                sb1.append(",");
                            }
                            if (user.lastName != null) {
                                sb.append(",").append(user.lastName);
                                sb1.append(",").append(user.lastName);
                            } else {
                                sb.append(",");
                                sb1.append(",");
                            }
                            if (userRole != null) {
                                sb.append(",").append(userRole);
                                // sb1.append(",").append(userRole);
                            } else {
                                sb.append(",");
                                // action = "3";
                                // sb1.append(action);
                            }
                            // sb1.append("1");
                            if (user.email != null) {
                                sb.append(",").append(user.email);
                                sb1.append(",").append(user.email);
                            } else {
                                sb.append(",");
                                sb1.append(",");
                            }

                            if (userRole != null) {
                                sb1.append(",").append(userRole);
                            } else {
                                sb1.append(",");
                            }

                            // sb1.append("1");

                            if (user.partnerData != null) {
                                if (user.partnerData.startsWith("pw")
                                        && user.partnerData.length() == 43) {
                                    sb.append(",");
                                }
                                if (user.partnerData.length() > 43) {
                                    String partnerData = user.partnerData
                                            .substring(44);
                                    sb.append(",").append(partnerData);
                                }
                                if (!user.partnerData.startsWith("pw")) {
                                    sb.append(",").append(user.partnerData);
                                }
                            }
                            sb.append(System.getProperty("line.separator"));
                            sb1.append(System.getProperty("line.separator"));
                        }
                    }
                }
            }
            // System.out.println(sb);
            System.out.println(sb1);

最佳答案

根据您的代码,您将所有内容附加到字符串缓冲区(sb)并立即打印。因此,在循环之间,您可以创建一个字符串 header 并根据条件分配值。在循环外首先打印标题,然后打印缓冲区。这将是最简单的灵魂。但是,如果数据量很大,最好使用文件。将所有内容写入文件,构造 header ,然后在循环后打印 header ,然后打印文件。具有虚拟逻辑和类的示例

import java.io.RandomAccessFile;
import java.util.ArrayList;
import java.util.List;

class UserList {
    public int totalCount;
    public List<KalturaUser> objects;

    public UserList(List<KalturaUser> objects) {
        this.objects = objects;
        this.totalCount = (objects != null) ? objects.size() : 0;
    }
}

class KalturaUser {
    public String id;
    public String email;
    public String firstName;
    public String lastName;
    public String partnerData;

    public KalturaUser(String id, String email, String firstName,
            String lastName, String partnerData) {
        this.id = id;
        this.email = email;
        this.firstName = firstName;
        this.lastName = lastName;
        this.partnerData = partnerData;
    }
}

public class DynamicHeader {

    private static final String NEW_LINE = System.getProperty("line.separator");

    public static void main(String[] args) throws Exception {
        UserList usersList = init();
        RandomAccessFile csv = new RandomAccessFile("temp.csv","rw");
        csv.setLength(0); //Clears the file
        String header = "";
        if (usersList.totalCount >= 1) {
            for (KalturaUser user : usersList.objects) {
                if (user != null && user.id != null) {
                    List<String> row = new ArrayList<String>();
                    String userRole = getUserRole(user.id);
                    String cnum = getUserUniqueId(user.email);
                    row.add(getNullSafeValue(user.id));
                    String action = "1";
                    if (cnum == null || userRole == null) {
                        action = "3";
                    }
                    row.add(action);
                    if (cnum != null) {
                        row.add(cnum);
                        header = "uniqueid,firstname,lastname,email";
                    } else {
                        row.add(user.id);
                        header = "userid,firstname,lastname,email";
                    }
                    row.add(getNullSafeValue(user.firstName));
                    row.add(getNullSafeValue(user.lastName));
                    row.add(getNullSafeValue(userRole));
                    row.add(getNullSafeValue(user.email));
                    if (user.partnerData != null) {
                        if (user.partnerData.startsWith("pw")) {
                            if (user.partnerData.length() == 43) {
                                row.add("");
                            } else if (user.partnerData.length() > 43) {
                                row.add(user.partnerData.substring(44));
                            }
                        } else {
                            row.add(user.partnerData);
                        }
                    }
                    csv.write(row.toString().replace("[", "").replace("]", "").replace(", ", ",").getBytes());
                    csv.write(NEW_LINE.getBytes());
                }
            }
        }
        csv.seek(0);
        System.out.println(header);
        String data;
        while((data = csv.readLine()) != null){
            System.out.println(data);
        }
        csv.close();
    }

    private static UserList init() {
        List<KalturaUser> userObjs = new ArrayList<KalturaUser>();
        userObjs.add(new KalturaUser("1", null, "Till", "Till", "Weiss"));
        userObjs.add(new KalturaUser("2", null, "ugilad", "ugilad", "ugilad"));
        userObjs.add(new KalturaUser("3", "abc@sample.com", "admin", "test", "admintest"));
        return new UserList(userObjs);
    }

    private static String getNullSafeValue(String str) {
        return (str != null) ? str : "";
    }

    private static String getUserUniqueId(String email) {
        return (email != null) ? email.substring(0, email.indexOf("@")) : null; //Replace with proper logic
    }

    private static String getUserRole(String id) {
        return ("2".equals(id)) ?  "Role 2" : null; //Replace with proper logic
    }

}

除此之外,您还可以在代码中进行一些清理,如下所示。您也可以将其添加到列表中,而不是构造字符串。列表的 toString 为您提供一个逗号分隔的值。

(usersList.totalCount != 0 && usersList.totalCount >= 1)    

可以减少到(usersList.totalCount > 0)

if (user != null) {  
    if (user.id != null) {}
}

如果您不必在 (user != null) 时执行任何特定操作,则可以将其合并为

if (user != null && user.id != null) {}

还有

if (cnum != null) {
    if (userRole == null) {
        action = "3";
    }
} else {
    action = "3";
}

这可以减少到

if (cnum == null || userRole == null) {
    action = "3";
} 

关于Java动态列标题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33129287/

相关文章:

java - 将文本文件解析为字符串(JAVA)

java - 如何使用注释设置模型中列的默认值

PHP动态生成表单上的页面通过post提交

c - 使用 mmap() 如何创建动态大小的结构

c++ - 赋值运算符和条件语句

html - 固定位置不适用于标题

java - 谷歌分析报告 API v4 : get Sessions and Revenue data

java - 删除Google Play游戏数据后卡住,无法登录

c - C中的头文件递归

用于 outlook 的 php 邮件 header - 电子邮件到达 outlook 时为空,对于 gmail 到 yahoo 非常好