You need to sign in to do that
Don't have an account?
Suman 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
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
pcon
What is the output of csvRecordData and columnPositionMap from your debug statements?