int voltage_grab = analogRead(voltage_pin); //read voltage divider circuit output r1=10k(really 9.88k) r2=1k
int ampRead = analogRead(current_pin); //Read hall sensor output
voltage_grab and ampRead as outputs from the same function (on different pins, of course). I don't get it. Consistency in naming variables makes your life easier.
String dataString = String(id) + ", " + String(timestamp) + ", " + String(voltage_reading) + ", " + String(current_reading);
A colossal waste of resources. The File::println() function could be replaced with several calls to File::print() and one call to File::println() to print the individual variables, with no need to have the String class make the same unformatted conversion to a string. Concatenating is most certainly not required. After this line of code, several calls to the String class' destructor are going to be made, any one of which, when calling the defective free() function, can corrupt your memory.
Avoid that potential problem by ditching the String class.
I have no delay and can only get about 3 data points per second (float math?).
No. It is more likely that opening and closing the file for each record added is what is slowing you down. That, and all the constructor and destructor calls and copying memory locations that the String class has to do.