由java代码创建的csv将所有数据写入同一行

由java代码创建的csv将所有数据写入同一行,java,beanshell,sailpoint,Java,Beanshell,Sailpoint,这是一个beanshell代码,因此可能会出现一些问题 对于java开发人员来说很奇怪。emailFileAttachment函数是一个SailPointAPI,我正在使用的工具。我的问题是,我放在地图中的数据被放在excel文件的一行中。而我放在地图中的标题(“应用程序,Num_权限”)并没有打印在CSV文件的第一行。谁能帮帮我吗。下面是我的代码: import sailpoint.object.Application; import sailpoint.object.Identity; im

这是一个beanshell代码,因此可能会出现一些问题 对于java开发人员来说很奇怪。emailFileAttachment函数是一个SailPointAPI,我正在使用的工具。我的问题是,我放在地图中的数据被放在excel文件的一行中。而我放在地图中的标题(“应用程序,Num_权限”)并没有打印在CSV文件的第一行。谁能帮帮我吗。下面是我的代码:

import sailpoint.object.Application;
import sailpoint.object.Identity;
import java.sql.Connection;
import java.sql.PreparedStatement;
import javax.sql.DataSource;
import java.sql.SQLException;
import sailpoint.server.Environment;
import javax.sql.DataSource;
import java.sql.ResultSet;
import sailpoint.api.SailPointContext;
import java.io.BufferedWriter;
import java.io.IOExceptoin;
import java.io.FileWriter;
import sailpoint.object.EmailTemplate;
import sailpoint.object.EmailOptions;
import java.io.File;
import java.io.FileInputStream;
import sailpoint.object.EmailFileAttachment;
import java.util.HashMap;
import sailpoint.tools.Util;

    String query = "SELECT app.name as application, count(*) as num_entitlements FROM spt_application as app, spt_identity_entitlement as ent WHERE app.id = ent.application GROUP BY app.name"; 
    HashMap info = new HashMap();
    info.put("Application ", "Num_Entitlement");
    PreparedStatement getEntitlement_Num = null;
    Connection conn = null;
    /*
    public static byte[] readFiletoByteArray(File file)   
        {      
            FileInputStream fileInputStream = null;      
            byte[] byteFile = new byte[(int) file.length()];      
            try      
            {              
                fileInputStream = new FileInputStream(file);         
                fileInputStream.read(byteFile);         
                fileInputStream.close();         
            }      
            catch (Exception e)      
            {         
                e.printStackTrace();      
            }      
            return byteFile;   
        } 
    */

    try{
        // Prepared Statements 
        Environment e = Environment.getEnvironment();
        DataSource src = e.getSpringDataSource();
        //System.out.println("DataSource: " + src.toString());
        conn = src.getConnection();
        //System.out.println("Connection: " + conn);
        getEntitlement_Num = conn.prepareStatement(query);
        ResultSet rs = getEntitlement_Num.executeQuery();
        //System.out.println("starting RS");
        while(rs.next()) {
                String appName = rs.getString("application");
                int no_ent = rs.getInt("num_entitlements");
                info.put(appName , no_ent); 
            }
                System.out.println("finished RS");
        }catch(SQLException e){
            log.error( e.toString());
        }  finally {
            if (getEntitlement_Num!= null) { 
                getEntitlement_Num.close(); 
            }
            if(conn != null) {
                conn.close();
               }
            } 
        //I am using sailpoint APIs for the code below. 
                    String emailDest = "//email address here";
        EmailTemplate et = new EmailTemplate();
        et.setFrom("//email address here");
        et.setBody("Please find an attached CSV file that has the list of all applications in IIQ and their number of Entitlements");
        et.setTo(emailDest);
        et.setSubject("Entitlement count for each application in IIQ");
        EmailOptions ops = new EmailOptions(emailDest,null);
        String strInfo = Util.mapToString(info);
        byte[] fileData = strInfo.getBytes();
        EmailFileAttachment attachment = new EmailFileAttachment( "EntitlementCount.csv", EmailFileAttachment.MimeType.MIME_CSV, fileData );
        ops.addAttachment(attachment);
        context.sendEmailNotification(et, ops);
        //System.out.println("email sent");
        return "Success";

您应该在与记录迭代相同的循环中使用StringBuilder,然后从StringBuilder制定附件


我认为带有chashma的Utility.MapToString是根本原因。

您应该在与records迭代相同的循环中使用StringBuilder,然后从StringBuilder制定附件


我认为带有chashma的Utility.MapToString是根本原因。

info
是一个
HashMap
,这意味着不能保证您可以按照放入数据的相同顺序提取数据。因此,在CSV文件中,标题“应用程序”可能不会排在第一位。取而代之的是,使用维护顺序的东西,例如
Tuple
对象的
ArrayList
(一个您自己编写的包含两个字符串变量的类)


Util.mapToString(info)是如何工作的?我们需要查看它,以便调查换行问题。

info
是一个
HashMap
,这意味着不能保证您可以按照放入数据的相同顺序提取数据。因此,在CSV文件中,标题“应用程序”可能不会排在第一位。取而代之的是,使用维护顺序的东西,例如
Tuple
对象的
ArrayList
(一个您自己编写的包含两个字符串变量的类)

Util.mapToString(info)是如何工作的?我们需要查看它,以便研究换行符问题。

Util.mapToString()只需将map转换为string。 尝试将集合更改为列表{app,count}和 迭代列表以生成字符串。 方法Util.listToCsv()或Util.listToQuotedCsv()将有助于准备csv字符串

希望这能有所帮助。

Util.mapToString()只需将映射转换为字符串即可。 尝试将集合更改为列表{app,count}和 迭代列表以生成字符串。 方法Util.listToCsv()或Util.listToQuotedCsv()将有助于准备csv字符串

希望这有帮助