SD card write very random, mostly not working

They won't let me post all my code (9500 character limit). I will post as much as I can with as little editing as possible.

#include <SPI.h>
#include <Ethernet.h>
#include <Wire.h>
#include <SD.h>
#include <Adafruit_AM2315.h>
#include <DHT.h>
#include <RTClib.h>


RTC_DS1307 rtc;

const int chipSelect = 4;

File dataFile;

// Box D Settings
   byte mac[] = {0xZZ, 0xAA, 0xDD, 0xFF, 0xD7, 0xWB};
    char writeNode[] = "node=3&csv=";
    char filename[] = "D_Data.csv";
char transmission1[450];

const long updateEmoncmsInterval = 90;      // Time interval in seconds to update Emoncms

DateTime lastConnectionTime = 0;
DateTime currentTime;
boolean lastConnected = false;
int failedCounter = 0;

EthernetClient client;

//DHT Settings

#define DHTTYPE DHT21

    DHT dht01(23, DHTTYPE);DHT dht02(22, DHTTYPE);DHT dht03(31, DHTTYPE);DHT dht04(30, DHTTYPE);
    DHT dht05(25, DHTTYPE);DHT dht06(24, DHTTYPE);DHT dht07(29, DHTTYPE);DHT dht08(28, DHTTYPE);
    DHT dht09(27, DHTTYPE);DHT dht10(26, DHTTYPE);DHT dht11(36, DHTTYPE);DHT dht12(37, DHTTYPE);
    DHT dht13(34, DHTTYPE);DHT dht14(35, DHTTYPE);DHT dht15(38, DHTTYPE);DHT dht16(39, DHTTYPE);
    DHT dht17(32, DHTTYPE);DHT dht18(33, DHTTYPE);DHT dht19(40, DHTTYPE);DHT dht20(41, DHTTYPE);

   DHT* dhtList[] = {&dht01, &dht02, &dht03, &dht04, &dht05, &dht06, &dht07, &dht08,
   &dht09, &dht10, &dht11, &dht12, &dht13, &dht14, &dht15, &dht16, &dht17, &dht18, &dht19, &dht20};


#define NUM_DHTS (sizeof(dhtList)/sizeof(DHT*))

typedef char humStr[7];  //4 digits + decimal point + 1 decimal + null terminator
typedef char tempStr[7]; //4 digits + decimal point + 1 decimal + null terminator


Adafruit_AM2315 am2315;
humStr numhum[NUM_DHTS];
tempStr numtemp[NUM_DHTS];
char exttemp[7];
char exthum[7];


void setup()
{
  Serial.begin(9600);
  pinMode(SS, OUTPUT);
  Wire.begin();
  rtc.begin();
  am2315.begin();
  
  if (!SD.begin(chipSelect)) Serial.println("Card failed, or not present");
  
  if (!SD.exists(filename)) {
      // only open a new file if it doesn't exist
      dataFile = SD.open(filename, FILE_WRITE);
      delay(100);
      dataFile.print(F("Date,Time,"));
      dataFile.print(F("Temp1,Hum1,Temp2,Hum2,Temp3,Hum3,Temp4,Hum4,Temp5,Hum5,"));
      dataFile.print(F("Temp6,Hum6,Temp7,Hum7,Temp8,Hum8,Temp9,Hum9,Temp10,Hum10,"));
      dataFile.print(F("Temp11,Hum11,Temp12,Hum12,Temp13,Hum13,Temp14,Hum14,Temp15,Hum15,"));
      dataFile.println(F("Temp16,Hum16,Temp17,Hum17,Temp18,Hum18,Temp19,Hum19,Temp20,Hum20,ExtTemp,ExtHum"));
      dataFile.close(); 
           }
    
  Serial.println(F("SD card initialized."));
  
  for (int i=0; i < NUM_DHTS; i ++)
  {
    dhtList[i]->begin();
  }

 
  Serial.print(F("After Setup freeRam ="));
  Serial.println(freeRam());
 
 }

void loop()
{
  currentTime = rtc.now();
  Serial.print(F("freeRam ="));
  Serial.println(freeRam());
  Serial.print(F("lastupdate:"));
  Serial.println(currentTime.unixtime() - lastConnectionTime.unixtime());
  
  serialprinttime();
  
  if (currentTime.unixtime() - lastConnectionTime.unixtime() > updateEmoncmsInterval)
  {
      startEthernet();        
     for (int i = 0; i < NUM_DHTS; i++)
     {
     
      float h = dhtList[i]->readHumidity();
      float t = dhtList[i]->readTemperature();
      if (isnan(t) || isnan(h)) 
        {
          //memset(numhum[i], '\0', 6);
          //memset(numtemp[i], '\0', 6);
          h=0.0;
          t=0.0;
        }
 //     else
 //      {
        
        dtostrf(h, 6, 1, numhum[i]);
        dtostrf(t, 6, 1, numtemp[i]);
        trim(numhum[i]);
        trim(numtemp[i]);
 //       }
      strcat(transmission1,numtemp[i]);
      strcat(transmission1, ",");
      strcat(transmission1, numhum[i]);
      strcat(transmission1, ",");
      
      
      Serial.print(i); Serial.print("     ");
      Serial.print((char*)numhum[i]); Serial.print("     ");
      Serial.println((char*)numtemp[i]);
      memset(numhum[i], '\0', 6);
      memset(numtemp[i], '\0', 6);
      }
       float eh = am2315.readHumidity();
       float et = am2315.readTemperature();
       if (isnan(et) || isnan(eh)) 
         {
          memset(exthum, '\0', 6);
          memset(exttemp, '\0', 6);

         }
      else
        {
         dtostrf(et, 6, 1, exttemp);
         dtostrf(eh, 6, 1, exthum);
         trim(exthum);
         trim(exttemp);
         }
      Serial.print("Ext Temp: ");
      Serial.println(exttemp);
      Serial.print("Ext Humidity: ");
      Serial.println(exthum);
       strcat(transmission1,exttemp);
       strcat(transmission1,",");
       strcat(transmission1,exthum);
     
     Serial.print(F("At the end of DHT read freeRam ="));
     Serial.println(freeRam());
     
  // Update Emoncms
  if(!client.connected())
  {
    Serial.println(transmission1);
        
    updateEmoncms(transmission1, writeNode);
    delay(1000);
    client.stop();
    dataFile = SD.open(filename, FILE_WRITE);
    saveSDtime();
    char* sddata;
    sddata = strtok(transmission1,",");
    while (sddata != NULL)
    {
      dataFile.print(sddata);
      dataFile.print(",");
      sddata = strtok(NULL,",");
      dataFile.flush();
      delay(10);
    }
    dataFile.println();
    delay(1000);
    dataFile.close();
    
    Serial.println(F("Sent Transmission"));
   }  
         
  memset(transmission1, '\0', 300);
  }
 
  if (!client.connected() && lastConnected)
  {
    
    Serial.println(F("...disconnected"));
    Serial.println();
    
    client.stop();
  }
  
  if (failedCounter > 3 ) 
  { 
    Serial.println(F("Checking failed counter"));
    startEthernet();

    }
  
  lastConnected = client.connected();
  
  
 delay(1000);
}

void updateEmoncms(char emData[450] , char writeNode[12])
{
  if (client.connect("mywebsite.com", 80))
  {         
    client.print(F("GET "));
    client.print(F("/emoncms/input/post.json?"));
    client.print(writeNode);
    client.print(emData);
    client.print(F("&apikey=dfXCXCXCXCXCXCXCXCXCXCXC2f29"));
    client.println(F(" HTTP/1.1"));
    client.println(F("Host: mywebsite.com"));
    client.print(F("User-Agent: Arduino-ethernet"));
    client.println(F("Connection: close"));
    client.println();
    
    lastConnectionTime = rtc.now();
    Serial.print(F("After Emoncms transmission freeRam ="));
    Serial.println(freeRam());
    memset(emData, '\0', 325);
    
    if (client.connected())
    {
      Serial.println(F("Connecting to Emoncms..."));
      Serial.println();
      
      failedCounter = 0;
    }
    else
    {
      failedCounter++;
  
      Serial.println("Connection to Emoncms failed ("+String(failedCounter, DEC)+")");   
      Serial.println();
    }
    
  }
  else
  {
    failedCounter++;
    
    Serial.println("Connection to Emoncms Failed ("+String(failedCounter, DEC)+")");   
    Serial.println();
    
     
  }
}


void startEthernet()
{
  
  client.stop();
 
  Serial.println(F("Connecting Arduino to network..."));
  Serial.println();  

  delay(1000);
  
  // Connect to network amd obtain an IP address using DHCP
  if (Ethernet.begin(mac) == 0)
  {
    Serial.println(F("DHCP Failed, reset Arduino to try again"));
    Serial.println();
  }
  else
  {
    Serial.println(F("Arduino connected to network using DHCP"));
    Serial.println();
  }
  
  delay(1000);
}

int freeRam () 
{
  extern int __heap_start, *__brkval; 
  int v; 
  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); 
}

void serialprinttime()
{
  Serial.print(currentTime.year(), DEC);
    Serial.print('/');
    Serial.print(currentTime.month(), DEC);
    Serial.print('/');
    Serial.print(currentTime.day(), DEC);
    Serial.print(' ');
    Serial.print(currentTime.hour(), DEC);
    Serial.print(':');
    if (currentTime.minute() < 10) Serial.print(F("0"));
    Serial.print(currentTime.minute(), DEC);
    Serial.print(':');
    if (currentTime.second() < 10) Serial.print(F("0"));
    Serial.print(currentTime.second(), DEC);
    Serial.println();
}
void saveSDtime()
{
  dataFile.print(currentTime.year(), DEC);
  dataFile.print(F("/"));
  dataFile.print(currentTime.month(), DEC);
  dataFile.print(F("/"));
  dataFile.print(currentTime.day(), DEC);
  dataFile.print(F(", "));
  dataFile.print(currentTime.hour(), DEC);
  dataFile.print(F(":"));
  if (currentTime.minute() < 10) dataFile.print(F("0"));
  dataFile.print(currentTime.minute(), DEC);
  dataFile.print(F(":"));
  if (currentTime.second() < 10) dataFile.print(F("0"));
  dataFile.print(currentTime.second(), DEC);
  dataFile.print(F(", "));
}

void trim(char* _str)
{
  while( (strlen(_str) > 0) && (_str[0] == 32) )
  {
     strcpy(_str,&_str[1]);
  }

  while( (strlen(_str) > 0) && (_str[strlen(_str) - 1] == 32) )
  {
    _str[strlen(_str) - 1] = 0;
  }  
}

numhum and numtemp are typedef char. It wouldn't serial.print until I cast them as char*.

I'm using both the W5100 and the SD card SPI, do I need to explicitly activate/deactivate each system before and after using it?

T