Mantenere le colonne dei dati per nome e rimuovere gli altri all'interno di un DataTable

c# datatable sqlbulkcopy

Domanda

Ho un file csv con 35+ colonne, quindi viene inserito in una tabella dati usando il mio lettore csv, voglio trovare 4 colonne per nome e quindi rimuovere il resto, le 4 colonne potrebbero essere a indici casuali quindi voglio cercare il nome dell'intestazione.

Finora ho questo:

DataTable dataTable = new DataTable();
dataTable = CSVReader.CSVInput(filepath);

foreach(DataColumn dataColumn in dataTable.Columns)
{
    if(dataColumn.ColumnName != "Cat" || dataColumn.ColumnName != "Dog" || dc.ColumnName != "Turtle " || dc.ColumnName != "Lion")
    {
        dataTable.Columns.Remove(dataColumn)
    }
}

Cat, Dog, Turtle and lion sono gli esempi delle colonne che voglio mantenere

Questo rimuove solo la prima colonna e visualizza un errore che dice "La raccolta è stata modificata".

Voglio farlo così posso quindi sqlbulkcopy il datatable.

MODIFICARE

la creazione di un'altra tabella dati esaurirà la memoria

Risposta accettata

Non è possibile modificare una raccolta mentre si enumera su di essa. Puoi cambiare il tuo codice in un ciclo for standard con un indice a ritroso come questo

for(int x = dataTable.Columns.Count - 1; x >= 0; x--)
{
   DataColumn dc = dataTable.Columns[x];
   if(dc.ColumnName != "Cat" && dc.ColumnName != "Dog" && 
      dc.ColumnName != "Turtle " && dc.ColumnName != "Lion")
   {
       dc.Columns.Remove(dataColumn)
   }
}

Il ciclo in ordine inverso è necessario per evitare il salto di colonne quando si rimuove un oggetto dalla raccolta. Inoltre, come spiegato, nel commento seguente, è necessario utilizzare l'operatore && logico per rimuovere TUTTE le colonne che non hanno un nome come il quattro che si desidera conservare. Usando il || l'operatore logico rimuoverà tutte le colonne perché la colonna denominata "Lion" verrà rimossa perché il suo nome non è "cat" (o qualsiasi altra cosa nella condizione if).

C'è anche la possibilità di usare un DataView per estrarre solo le colonne che ti servono, ma questo ha lo svantaggio di richiedere un secondo datatable in memoria e potresti incontrare problemi se il tuo set di dati è veramente grande.

DataTable datatable = CSVReader.CSVInput(filepath);
DataView dv = new DataView(datatable);
DataTable newTable = dv.ToTable(false, new string[] {"cat", "dog", "turtle", "lion"});


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché