Animating a dynamic amount of objects from CSV data using Animation Nodes
I finally gave up on Animation Nodes and just wrote a simple Python script instead. I changed the format of the CSV so 1 line = 1 keyframe. This is simpler but it could probably be more efficient by not forcing you to place keyframes constantly.

The objects are still separated by '$' characters to simplify parsing.

An Example CSV file can be found here

Script below:

import bpy
import csv

# File to open
csvFile = open('example-data.csv')

# Separate by lines
csvFileLines = csvFile.readlines()
csvFileLines = [line.rstrip('\n') for line in csvFileLines]
#Remove first row
csvFileLines.pop(0)

#How many objects should we instantiate?
objectCount = len(csvFileLines[0].split("$"))
print("Objects found: " + objectCount)

objs = []
objs.append(bpy.context.active_object) # First obj added is the current active object
# Get scene
scn = bpy.context.scene

# Instantiate all objects needed
for x in range(1, objectCount):
    objs.append(objs[0].copy()) # Copy first object
    objs[x].name += str(x) # Give unique name
    bpy.context.collection.objects.link(objs[x]) # Link to scene

keyInterp = bpy.context.preferences.edit.keyframe_new_interpolation_type # Remember user selected interpolation type
bpy.context.preferences.edit.keyframe_new_interpolation_type ='LINEAR' # Set interpolation type to linear

for i, line in enumerate(csvFileLines):
    # Find objects
    csvObjectPosRot = line.split("$")
    for r, values in enumerate(csvObjectPosRot):
        # Find values from object string
        csvObjectValues = values.split(",")
        # Set object position
        objs[r].location = (float(csvObjectValues[0]), float(csvObjectValues[1]), float(csvObjectValues[2]))
        # Set object rotation
        objs[r].rotation_euler = (float(csvObjectValues[3]),float(csvObjectValues[4]),float(csvObjectValues[5]))  # Note that you need to use radians rather than angles here
        # Add keyframe for object
        objs[r].keyframe_insert(data_path='location', frame=(i))
        objs[r].keyframe_insert(data_path='rotation_euler', frame=(i))

bpy.context.preferences.edit.keyframe_new_interpolation_type = keyInterp # Revert interpolation type to the users last selection