Instantiating new objects instead of for each

Hi guys, I was following Sloan Kellys video on how to create game objects from an excel sheet file, basically getting the xyz from a list of points. I can spawn new objects for each existing object in my scene but if I assign the same object to multiple points it only instantiates once. Was wondering if anyone can point me in the right direction of what to change to be able to instantiate multiple objects using just one object from my scene. Thanks!

using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.ComponentModel;
using LINQtoCSV;
using UnityEngine;

public class CsvExampleObjectSpawner : MonoBehaviour
{
    private Dictionary<string, GameObject> prefabs = new Dictionary<string, GameObject>();

    [Tooltip("The prefabs for each object")]
    public GameObject[] objects;

    [Tooltip("The file that contains the objects to be spawned in this scene")]
    public TextAsset sceneDescriptor;

    /*[Tooltip("The level that the player is currently on")]
    public string levelName = "red";*/

    void Awake()
    {
        foreach (var obj in objects)
        {
            prefabs[obj.name] = obj;
        }
    }

    void Start()
    {
        CsvFileDescription inputFileDescription = new CsvFileDescription
        {
            SeparatorChar = ',',
            FirstLineHasColumnNames = true
        };

        using (var ms = new MemoryStream(sceneDescriptor.text.Length))
        {
            using (var txtWriter = new StreamWriter(ms))
            {
                using (var txtReader = new StreamReader(ms))
                {
                    txtWriter.Write(sceneDescriptor.text);
                    txtWriter.Flush();
                    ms.Seek(0, SeekOrigin.Begin);

                    // Read the data from the CSV file
                    CsvContext cc = new CsvContext();
                    cc.Read<CsvSceneObject>(txtReader, inputFileDescription)
                      //.Where(so => so.LevelName.Equals(levelName))
                      .ToList()
                      .ForEach(so =>
                      {
                          // Create an instance of the named prefab (don't forget give the instance the name and postion)
                          GameObject copy = Instantiate(prefabs[so.PrefabName]);
                          copy.name = so.InstanceName;
                          copy.transform.position = new Vector3(so.x, so.y, so.z);
                          //copy.SetActive(so.InitiallyVisible == Visibility.Yes);
                      });
                }
            }
        }
    }
}

If you’re looking to deconflict spatially you need to track what you instantiated, and if a subsequent attempt to instantiate is “too close” (whatever that means), then don’t spawn it.

If the positions are reliably-keyable, such as integers, then you could use them as a key into a HashSet or Dictionary and decide if that spot is already “full.”