Leer archivos csv en Blazor Web Assembly

Leer archivos es un funcionalidad requerida en mucho escenarios. Blazor se ejecuta del lado del cliente y contiene herramientas para leer y previsualizar archivos en el navegador, esto permite confirmar con el usuario el archivo que intenta cargar al sistema o pre-procesar la información.

Dentro de nuestro componente vamos agregar un InputFile para cargar el archivo:

 <InputFile OnChange="@OnInputFileChange"  class="btn btn-primary" />

El método OnInputFileChange vamos a validar que el archivo sea cargado, tenga el formato CSV y luego leer la información para convertirla en un archivo csv:

       public async Task OnInputFileChange(InputFileChangeEventArgs e)
        {
            SpinnerModal.ShowSpinner();
            var singleFile = e.File;

            Regex regex = new Regex(".+\\.csv", RegexOptions.Compiled);
            if (!regex.IsMatch(singleFile.Name))
            {
                //show error invalidad format file
            }
            else
            {
                var stream = singleFile.OpenReadStream();
                var csv = new List<string[]>();
                MemoryStream ms = new MemoryStream();
                await stream.CopyToAsync(ms);
                stream.Close();
                var outputFileString = System.Text.Encoding.UTF8.GetString(ms.ToArray());

                foreach (var item in outputFileString.Split(Environment.NewLine))
                {
                    csv.Add(SplitCSV(item.ToString()));
                }

             }
}

        private string[] SplitCSV(string input)
        {
            //Excludes commas within quotes
            Regex csvSplit = new Regex("(?:^|,)(\"(?:[^\"]+|\"\")*\"|[^,]*)", RegexOptions.Compiled);
            List<string> list = new List<string>();
            string curr = null;
            foreach (Match match in csvSplit.Matches(input))
            {
                curr = match.Value;
                if (0 == curr.Length)
                {
                    list.Add("");
                }

                list.Add(curr.TrimStart(','));
            }

            return list.ToArray();
        }

La función SplitCSV nos permite obtener los datos de cada fila teniendo en cuenta que algunas pueden contener comas dentro de sus columnas, si hacemos simplemente un Split(“,”) de ese string se transformaría la información de manera incorrecta.