I think your approach is not the best, because either you add a "named attribute" node for each named attribute, which means for each frame of the animation [ouch], or you use current frame to evaluate strings, to pass them as attribute names (but strings don't support fields, which is a limitation…). Meanwhile, you can just load data as vertex positions, and operate on that, so this is the workflow I'll present.
If we have some csv file, for example comma delimited coordinates of a rotating triangle:
from math import cos, sin, tau
with open("E:/file.csv", "w") as f:
for i in range(300):
for j in (0, 1/3*tau, 2/3*tau):
x = round(sin(i/100+j), 3)
y = round(cos(i/100+j), 3)
print(x, y, .0, sep=',', file=f)
I won't paste the whole file here, instead here's how it's supposed to be read:
frame0 vert0 x, frame0 vert0 y, frame0 vert0 z
frame0 vert1 x, frame0 vert1 y, frame0 vert1 z
frame0 vert2 x, frame0 vert2 y, frame0 vert2 z
frame1 vert0 x, frame1 vert0 y, frame1 vert0 z
frame1 vert1 x, frame1 vert1 y, frame1 vert1 z
frame1 vert2 x, frame1 vert2 y, frame1 vert2 z
frame2 vert0 x, frame2 vert0 y, frame2 vert0 z
frame2 vert1 x, frame2 vert1 y, frame2 vert1 z
frame2 vert2 x, frame2 vert2 y, frame2 vert2 z
frame3 vert0 x, frame3 vert0 y, frame3 vert0 z
frame3 vert1 x, frame3 vert1 y, frame3 vert1 z
frame3 vert2 x, frame3 vert2 y, frame3 vert2 z
...
Now we can load that to a numpy array and efficiently add a new mesh with the correct number of vertices and set their positions:
import numpy as np
from bpy import context as C, data as D
coords = np.loadtxt("E:/file.csv", delimiter=',', dtype=np.float32)
me = D.meshes.new('data_mesh')
me.vertices.add(len(coords))
coords = coords.flatten() # foreach_set always expects 1-dimensional array
me.vertices.foreach_set('co', coords)
ob = D.objects.new('data_object', me)
C.collection.objects.link(ob)
And now this new object can be loaded to geonodes, or geonodes can be applied on that object. Then positions can be sampled on the vertices according to some formula:

The example is not astonishing, but it works:

You could do various stuff with this data now, for example you can use geometry proximity to find out which 'vertex' (in quotes, because it's technically a vertex, but it's just there to hold data about position of the actual vertex) is the closest to a given position, and then the obtained index modulo 3 will give you the index of the (actual) vertex, and floor(index/3)
will give you a frame on which this vertex was at that spot. You can't do stuff like this using named attributes…