zoukankan      html  css  js  c++  java
  • 从AX2012系统批量生成CSV格式数据

    以CSV格式导出数据,大家应该都很熟悉,最近遇到导出CSV格式的数据格式,这里分享下。导出CSV格式的数据,我这里总结了三种:

    1.以逗号分隔的csv文件(字段内容无双引号,不推荐用,若导入数据值中有逗号,容易错列)

    Public boolean AX3PLExport_Cust_Bth()
    {
        TextBuffer              textBuffer;
        str                     FileName,FilePath, File;
        CustTable               custTable;
        FileIOPermission        fioPermission;
        int                     Lines;
        str                     custAccount;
        #File
        ;
    	
        FilePath    = "C:Test"	;
        Filename    = Test.csv;
        File  = FilePath + '\\' + Filename;
    
        try
        {
            fioPermission = new FileIOPermission(File ,"RW");
            fioPermission.assert();
    
            textBuffer  = new TextBuffer();
            textBuffer.appendText("CustAccount,");
            textBuffer.appendText("CustName,");
            textBuffer.appendText("CustAddress");  
            textBuffer.appendText("
    ");
    		
            ttsBegin;
    
            while select  forupdate custTable
                index hint AccountIdx
                where custTable.Transferred == NoYes::No
                  &&  custTable.AccountNum
            {
                textBuffer.appendText(custTable.AccountNum); //textBuffer.appendText('"' + custTable.AccountNum + '",'); 可手动加双引号
                textBuffer.appendText(strReplace(custTable.name(), "
    ", "")); 
                textBuffer.appendText(strReplace(custTable.address(), "
    ", "")); 
                textBuffer.appendText("
    ");
            }
    		
            ttsCommit;
            Lines = textBuffer.numLines();
            try 
            {               
                if (textBuffer.toFile(File,FileEncoding::UTF8))  
                    info( strfmt("File Generated as %1.total insert %2 Lines",File,Lines));  
            }  
            catch ( Exception::Error )  
            {  
                error (strFmt("No Data export for MainProducts",File));  
            }    
            CodeAccessPermission::revertAssert();
        }
        catch(Exception::Deadlock)
        {
            retry;
        }
        if (Lines > 0)
        {
            return true;
        }
        else
        {
            return False;
        }
    }
    

    导出格式如下:若需要导出待双引号的csv格式,可参考代码注释的地方,强行加入双引号,但这样就比较繁琐了  

    2. 导出双加号的csv文件,UTF-8格式(带BOM的的UTF-8)

    Public boolean AX3PLExport_CustCSV_Bth()
    {
        CommaTextIo             commaTextIo;
        container               line;
        str                     FileName,FilePath, File;
        CustTable               custTable;
        FileIOPermission        fioPermission;
        int                     Lines;
        str                     custAccount;
        #File
        ;
    
        FilePath    = "C:Test" ;
        Filename    = "Test.csv";
        File  = FilePath + '\\' + Filename;
    	
        try
        {
            fioPermission = new FileIOPermission(File ,"RW");
            fioPermission.assert();
    
            commaTextIo  = new CommaTextIo(File, #io_write, 65001);//65001代表UTF-8的编码格式,默认是带Bom的UTF-8
    
            if (!file || commaTextIo.status() != IO_Status::Ok)
            {
                throw error("File cannot be opened.");
            }
    
            ttsBegin;
    
            while select forUpdate custTable
                where  custTable.Transferred == NoYes::No
                 &&    custTable.AccountNum
            {
                 line = [custTable.AccountNum,
                        strReplace(custTable.name(), "
    ", ""),
                        strReplace(custTable.address(), "
    ", "")];
    
                commaTextIo.writeExp(line);
                Lines++;
            }
    
            ttsCommit;
    
            try 
            {               
                if (File)  
                    info( strfmt("File Generated as %1.total insert %2 Lines",File,Lines));  
            }  
            catch ( Exception::Error )  
            {  
                error (strFmt("No Data export for MainProducts",File));  
            }         
            CodeAccessPermission::revertAssert();
        }
        catch(Exception::Deadlock)
        {
            retry;
        }
    }
    

    导出的格式如下。这样的格式大多数情况下就满足了我们的需求。但假如是导出的接口数据,某些奇葩系统没法解析,只认不带BOM的UTF-8格式就不好用了。

     3. 导出双加号的csv文件,UTF-8格式(不带BOM的的UTF-8,单独运行没有问题,当批处理跑时,就会报当前文件被另一进程使用)

    Public boolean AX3PLExport_CustCSV_Bth()
    {
        CommaTextIo             commaTextIo;
        container               line;
        str                     FileName,FilePath, File;
        CustTable               custTable;
        FileIOPermission        fioPermission;
        int                     Lines;
        str                     custAccount;
        System.Text.Encoding    encoding = new System.Text.UTF8Encoding(false);
        #File
        ;
    
        FilePath    = "C:Test" ;
        Filename    = "Test.csv";
        File  = FilePath + '\\' + Filename;
    
        try
        {
            fioPermission = new FileIOPermission(File ,#io_write);
            fioPermission.assert();
            commaTextIo  = new CommaTextIo(File, #io_write, 65001);
            if (!file || commaTextIo.status() != IO_Status::Ok)
            {
                throw error("File cannot be opened.");
            }
    		
            ttsBegin;
            while select forUpdate custTable
                where  custTable.Transferred == NoYes::No
                 &&    custTable.AccountNum
            {
                 line = [custTable.AccountNum,
                        strReplace(custTable.name(), "
    ", ""),
                        strReplace(custTable.address(), "
    ", "")];
    
                commaTextIo.writeExp(line);
                Lines++;
            }        
            CodeAccessPermission::revertAssert();
            commaTextIo = null;
            ttsCommit;
            
            new InteropPermission(InteropKind::ClrInterop).assert();
            System.IO.File::WriteAllText(File, System.IO.File::ReadAllText(File), encoding);
            CodeAccessPermission::revertAssert();
    
            try 
            {               
                if (File)  
                    info( strfmt("File Generated as %1.total insert %2 Lines",File,Lines));  
            }  
            catch ( Exception::Error )  
            {  
                error (strFmt("No Data export for MainProducts",File));  
            }  
           
        }
        catch(Exception::Deadlock)
        {
            retry;
        }
    }
    

    结果如下:

    第三种方法详情可参考这篇博客:

    https://community.dynamics.com/ax/f/microsoft-dynamics-ax-forum/220574/how-to-export-to-csv-file-in-utf-8-without-bom

    4. 导出带双加号的csv文件,UTF-8无Bom格式,可批处理使用。

    private void ExportCust()
    {
        TextBuffer              textBuffer;
        str                     FileName,FilePath, File;
        CustTable               custTable;
        FileIOPermission        fioPermission;
        int                     Lines;
        str                     custAccount;
        str                     data;
        System.Text.Encoding    encoding = new System.Text.UTF8Encoding(false);
        #File
        ;
    
        File  = @'C:Tmpaccounts.csv';
    
        try
        {
            fioPermission = new FileIOPermission(File ,"RW");
            fioPermission.assert();
    
            textBuffer  = new TextBuffer();
    
            while select firstOnly  custTable
            {
                textBuffer.appendText('"' + custTable.AccountNum + '",');
                textBuffer.appendText('"' + strReplace(custTable.name(), "
    ", "") + '",');
                textBuffer.appendText('"' + strReplace(custTable.address(), "
    ", "") + '"');
                textBuffer.appendText("
    ");
            }
    
            Lines = textBuffer.numLines();
            info(textBuffer.getText());
            data = textBuffer.getText();
            textBuffer.toFile(File,FileEncoding::UTF8);
    
            CodeAccessPermission::revertAssert();
    
            try
            {
                new InteropPermission(InteropKind::ClrInterop).assert();
                System.IO.File::WriteAllText(File, data, encoding);
                CodeAccessPermission::revertAssert();
    
                if (File)
                    info( strfmt("File Generated as %1.total insert %2 Lines",File,Lines));
    
            }
            catch ( Exception::Error )
            {
                error (strFmt("No Data export for MainProducts",File));
            }
        }
        catch(Exception::Deadlock)
        {
            retry;
        }
    
    }

    Wishs to help you.

  • 相关阅读:
    BZOJ3065(替罪羊树套线段树)
    BZOJ3052(树上带修莫队)
    BZOJ1095(动态点分治+堆)
    NOIWC颓废记
    BZOJ2125 最短路
    Simpson积分(BZOJ2178)
    BZOJ4555 [Tjoi2016&Heoi2016]求和
    NTT+多项式求逆+多项式开方(BZOJ3625)
    Miller-Rabin,Pollard-Rho(BZOJ3667)
    单纯形求解线性规划(BZOJ1061)
  • 原文地址:https://www.cnblogs.com/sunny-technology/p/11585786.html
Copyright © 2011-2022 走看看