Пользовательский инструмент картирования для TXT или Excel - PullRequest
2 голосов
/ 24 ноября 2011

У меня есть документ Excel (вкладка с разделителями). Каждый раз, когда я могу вставить Excel в свою программу, мне нужно сопоставить имена столбцов клиентов с именами в моем приложении.

Так что, прежде чем я начну разрабатывать картографический инструмент - было бы лучше, если бы он уже существовал. Но я не знаю, я не нашел это.

Этот инструмент фактически читает файл Excel или TXT, позволяет мне называть имена всех новых столбцов справа и перетаскивать (например).

Может быть, у этого инструмента есть xml или что-то еще, где я могу определить свои пользовательские столбцы, и тогда он будет показывать op справа.

Надеюсь, вы понимаете, о чем я, и что кому-то это тоже нужно.

Спасибо

обновление информации

Я хотел бы упомянуть несколько вещей в качестве обновления моего вопроса, если еще не поздно: у меня есть около 50 заголовков / столбцов (например: Имя, Отчество, Street1, Street2, ..). Так что мне всегда нужно делать каждый раз, когда клиент дает мне свой файл Excel (резервное копирование контактов), вручную копировать данные для каждого своего столбца в тот, что находится на моей стороне. И проблема в том, что у каждого клиента разные имена столбцов, а также некоторые из столбцов клиента могут переходить в несколько столбцов на моей стороне.

Так что я думаю, что если я не смогу найти решение, я бы создал приложение на языке c ++ / qt, которое будет превосходным и позволит мне назначить (перетаскивать и т. Д.) Каждый столбец его стороны на или более колонны моей стороны.

Я не занимался программированием на vb, так что если вы можете немного подробнее рассказать о том, как подойти к решению ib, это было бы здорово.

Ответы [ 2 ]

2 голосов
/ 24 ноября 2011

Первая часть ответа : Вы можете добиться этого с помощью простого VBScript. Скопируйте этот код в текстовый файл с расширением VBS и дважды щелкните.

Dim oCN As Connection
Dim fs As Scripting.FileSystemObject

Set oCN = New Connection
Set fs = New Scripting.FileSystemObject

sCSVFileName = "C:\Temp\Test1.csv"
sSourceSql = "SELECT field1 as f1, field2 as f2, ... FROM " & 
             fs.GetFileName(sCSVFileName )
sDestinationTable = "yourAppTable"

With oCN
    .Provider = "Microsoft.Jet.OLEDB.4.0"
    .Properties("Extended Properties").Value = 
          "TEXT;HDR=YES;FMT=TabDelimited;MAXSCANROWS=0"
    .Open fs.GetFile(sCSVFileName).ParentFolder
End With


sSql = "INSERT INTO [ODBC;DRIVER={SQL Server};Server=" & 
       ServerName & ";Database=" & DBName & _
        IIf(IntegratedSecurity, ";Trusted_Connection=Yes;", _
            ";UID=" & UID & ";PWD=" & PWD & ";") & _
        "]." & sDestinationTable & " " & sSourceSql

oCN.Execute sSql, , adExecuteNoRecords

Больше информации на форумах Майкрософт

Кроме того, вы можете параметризовать сопоставление (исходные и целевые таблицы и поля сопоставления) с помощью внешнего XML-файла .

Вторая часть ответа : Вы спрашиваете, нужно ли это кому-то еще, и является ли это хорошей идеей. Ну, это очень хорошее предложение. И по этой причине они являются некоторыми решениями с этой функциональностью.

Прежде всего, этот вид технологии называется ETL . Извлечь - преобразовать - загрузить.

Каждая база данных имеет свой собственный инструмент

Также существуют специфические технологии:

Все эти инструменты имеют возможности сопоставления столбцов.

1 голос
/ 24 ноября 2011

Я использую универсальный механизм отображения для этого, настроенный парой массивов, в которые вы помещаете имена, используемые в вашем приложении (aDsNames), вместе с ними в ваш источник, файл csv в вашем случае (aDbNames) Я обхожу поля в источнике, проверяю, находится ли getDbName (name) в aDsNames, и если да, записываю значение в строку вставки в базу данных. Вы можете сделать это обоими способами, обычно мое приложение запрашивает поле для модуля базы данных на сервере, этот модуль преобразует имя базы данных и делает выбор. Надеюсь, что это полезно .. Приветствия

select case store
  case "store1Midoc"
    aDbNames = array("id"    , "beheerder", "datumlijst", "rnr13" , "datvan", "dattot", "opmerking", "status" , "waarde", "kode"  , "type")
    aDsNames = array("id"    , "persnr   ", "datum     ", "rnr13" , "datvan", "dattot", "opmerking", "status" , "waarde", "kode"  , "type")
    aTypes   = array("number", "string",    "date"      , "string", "date"  , "date"  , "string"   , "number",  "number", "string", "string")
  case .....
end select

Function getDbName(dsName)
  Dim a
  getDbName = "undefined"
  If instr(join(aDsNames,","),dsName) Then
    For a = 0 to UBound(aDbNames)
      If aDsNames(a) = dsName Then 
        getDbName = aDbNames(a)
      End If
    Next 
  End If
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...