Pergunta

Oi eu estou tentando aprender Linq, então eu não tenho certeza se isso pode ser feito.

Eu estou trabalhando em um projeto de importação Então eu decidi importar dados usando conjuntos de dados.

Meu desafio neste momento: Tendo 2 DataTables com esquema diferente, uma das quais contém o meu esquema de destino, e o outro meu esquema de origem.

O que eu preciso fazer é realizar alguma correspondência coluna onde eu posso identificar minhas colunas de origem que são "algo semelhante" para minhas colunas de destino. Eu estou procurando algo neste momento em que se qualquer parte do nome da coluna de destino está contido na fonte, é uma correspondência possível Não sei de nenhuma maneira de determinar likeliness.

Por exemplo fonte [nome, sobrenome, endereço] -> destino [fname, lname, addr1]

Assim, é LINQ um potencial candidato para este trabalho? Ou expressões regulares? Eu comecei com este

Ter uma fonte DataTable dt

var Lcols = from c in dt.Columns.Cast<System.Data.DataColumn>()
select c.ColumnName;

Eu não tenho certeza para onde ir a partir daqui ...

Obrigado!

Foi útil?

Solução

LINQ pode ser um candidato aqui, mas acho que o que você precisa para definir (se você não tiver feito isso) é a forma como as colunas podem ser semelhantes. Qual é o ponto de corte? Depois de ter as condições sob as quais você pode mapear uma coluna para outra, você pode aplicar essas condições ao produto cartesiano dos dois conjuntos (as colunas da fonte é o primeiro set, enquanto o segundo é as colunas a partir do destino) para obter uma lista de possíveis correspondências.


Assumindo que você teve as colunas de origem e de destino, assim:

IEnumerable<DataColumn> sourceColumns = 
  sourceDt.Columns.Cast<System.Data.DataColumn>();
IEnumerable<DataColumn> destColumns =
  destDt.Columns.Cast<System.Data.DataColumn>();

E um IDictionary<string, string> que mapeou nomes das colunas na fonte para nomes de colunas no destino, você poderia fazer isso:

var map =
  from s in sourceColumns
  from d in destColumns
where
  // colMap is the IDictionary<string, string>
  // The map has to contain the key.
  colMap.ContainsKey(s.ColumnName) &&

  // The destination column has to match the column map.
  // The OrdinalIgnoreCase option means to ignore case.
  string.Compare(colMap[s.ColumnName], 
      d.ColumnName, CompareOptions.OrdinalIgnoreCase) == 0
select
  new { SourceColumn = s, DestinationColumn = d };

E que lhe dará os possíveis mapeamentos com base nos itens no dicionário.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top