function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
Suman DeepSuman Deep 

Null pointer exception in custom csv import.

Hi All. 
I am trying to add a loop that checks for blank values and assign 0 to them as my import is not allowing blank cells in csv.
Any help is greatly appreciated.

Error: System.NullPointerException: Attempt to de-reference a null object
Error is in expression '{!updateForecastItems}' in component <apex:commandButton> in page forecastimportcsvpage: Class.ForecastImportFromCSVController.updateForecastItems: line 34, column 1


public class ForecastImportFromCSVController {
    public Blob csvFileBody { get; set; }
    public string csvFileName { get; set; }
    public List<forecast_items__c> fcitemslist { get; set; }
    
    public string csvAsString = null;
    
    public ForecastImportFromCSVController (){
    }
    
    public void updateForecastItems(){
        //try{
        csvAsString = csvFileBody.toString();
        
        List<List<String>> importedCSVList = parseCSV(csvAsString, false);
        Map<String, Integer> columnPositionMap = new Map<String, Integer> ();
        Integer j = 0;
        for(String col : importedCSVList.get(0)) {
            col = col.replace('\r\n', '');
            col = col.replace('\n', '');
            col = col.replace('\r', '');
            columnPositionMap.put(col.toLowerCase(), j++);
        }
        
        system.debug('columnPositionMap -- '+columnPositionMap);
        
        List<forecast_items__c> fcitemslistToUpd = new List<Forecast_items__c>(); 
        
        for(Integer i = 1; i < importedCSVList.size(); i++){
            List<String> csvRecordData = importedCSVList.get(i);
            System.debug('csvRecordData -- '+csvRecordData);
            Forecast_items__c fcitemsObj = new forecast_items__c() ;
            
Error--> String tmpOrderAcc = csvRecordData.get(columnPositionMap.get('Orders_Account__c'.toLowerCase()));
            String tmpUnitAcc = csvRecordData.get(columnPositionMap.get('Units_Account__c'.toLowerCase()));
            
            
            if(tmpOrderAcc==null){
                fcitemsObj.Orders_Account__c = 0;
            }else {
                fcitemsObj.Orders_Account__c = Integer.valueOf(tmpOrderAcc);
                
            }
            
            if(tmpUnitAcc==null){
                fcitemsObj.Units_Account__c = 0;
            }else {
                fcitemsObj.Units_Account__c = Integer.valueOf(tmpUnitAcc);
                
            }
            
            
            System.debug('csv data : '  + csvRecordData.get(i));
            //Forecast_items__c fcitemsObj = new forecast_items__c() ;
            fcitemsObj.Id = csvRecordData.get(columnPositionMap.get('ID'.toLowerCase()));
            //fcitemsObj.Account__c = Integer.valueOf(csvRecordData.get(columnPositionMap.get('Account__c')));
            //fcitemsObj.Orders_Account__c = Integer.valueOf(csvRecordData.get(columnPositionMap.get('Orders_Account__c'.toLowerCase())));
            //fcitemsObj.Orders_Finance__c = Integer.valueOf(csvRecordData.get(columnPositionMap.get('Orders_Finance__c'.toLowerCase())));
            //fcitemsObj.Units_Account__c = Integer.valueOf(csvRecordData.get(columnPositionMap.get('Units_Account__c'.toLowerCase())));   
            //fcitemsObj.Units_Finance__c = Integer.valueOf(csvRecordData.get(columnPositionMap.get('Units_Finance__c'.toLowerCase())));                                                                             
            fcitemslistToUpd.add(fcitemsObj);
        }
        update fcitemslistToUpd;
        fcitemslist =  new List<Forecast_items__c>(); 
        fcitemslist.addAll(fcitemslistToUpd);
        //} catch (Exception e) {
        //ApexPages.Message errorMessage = new ApexPages.Message(ApexPages.severity.ERROR,'An error has occured while importin data Please make sure input csv file is correct');
        //ApexPages.addMessage(errorMessage);
        //}  
    }
    
    public static List<List<String>> parseCSV(String contents, Boolean skipHeaders) {
        List<List<String>> allFields = new List<List<String>>();
        
        // replace instances where a double quote begins a field containing a comma
        // in this case you get a double quote followed by a doubled double quote
        // do this for beginning and end of a field
        contents = contents.replaceAll(',"""',',"DBLQT').replaceall('""",','DBLQT",');
        // now replace all remaining double quotes - we do this so that we can reconstruct
        // fields with commas inside assuming they begin and end with a double quote
        contents = contents.replaceAll('""','DBLQT');
        // we are not attempting to handle fields with a newline inside of them
        // so, split on newline to get the spreadsheet rows
        List<String> lines = new List<String>();
        try {
            lines = contents.split('\n');
        } catch (System.ListException e) {
            System.debug('Limits exceeded?' + e.getMessage());
        }
        Integer num = 0;
        for(String line : lines) {
            
            system.debug('line 1-- '+line);
            line = line.replace('\r\n', '');
            line = line.replace('\n', '');
            line = line.replace('\r', '');
            system.debug('line 2-- '+line);
            
            // check for blank CSV lines (only commas)
            if (line.replaceAll(',','').trim().length() == 0) break;
            
            List<String> fields = line.split(',');  
            List<String> cleanFields = new List<String>();
            String compositeField;
            Boolean makeCompositeField = false;
            for(String field : fields) {
                if (field.startsWith('"') && field.endsWith('"')) {
                    cleanFields.add(field.replaceAll('DBLQT','"'));
                } else if (field.startsWith('"')) {
                    makeCompositeField = true;
                    compositeField = field;
                } else if (field.endsWith('"')) {
                    compositeField += ',' + field;
                    cleanFields.add(compositeField.replaceAll('DBLQT','"'));
                    makeCompositeField = false;
                } else if (makeCompositeField) {
                    compositeField +=  ',' + field;
                } else {
                    cleanFields.add(field.replaceAll('DBLQT','"'));
                }
            }
            
            allFields.add(cleanFields);
        }
        if (skipHeaders) allFields.remove(0);
        return allFields;       
    }
    
}

Thanks All
pconpcon
What is the output of csvRecordData and columnPositionMap from your debug statements?