Вы можете использовать Boost Tokenizer с escaped_list_separator.
escaped_list_separator анализирует надмножество csv. Boost :: tokenizer
Используется только заголовочные файлы Boost tokenizer, не требующие связывания с требуемыми библиотеками.
Вот пример, см. Parse CSV File With Boost Tokenizer В C ++ для деталей или
Boost::tokenizer
):#include
// cout, endl #include // fstream #include #include #include // copy #include // ostream_operator #include int main() { using namespace std; using namespace boost; string data("data.csv"); ifstream in(data.c_str()); if (!in.is_open()) return 1; typedef tokenizer< escaped_list_separator > Tokenizer; vector< string > vec; string line; while (getline(in,line)) { Tokenizer tok(line); vec.assign(tok.begin(),tok.end()); // vector now contains strings from one row, output to cout here copy(vec.begin(), vec.end(), ostream_iterator (cout, "|")); cout << "\n----------------------" << endl; } }
Если вы создаете похожую таблицу, вы можете использовать ее в двух подходах для динамического сопоставления столбцов в пакете служб SSIS, или вы должны построить весь пакет программно. В этом ответе я попытаюсь дать вам некоторое представление о том, как это сделать.
Примечание. Этот подход будет работать только в том случае, если все файлы .dbf имеют одинаковое количество столбцов, но имена различаются
[ 1143]. При таком подходе вы создадите команду SQL, которая будет использоваться в качестве источника, на основе созданного вами FileID и таблицы сопоставления. Вы должны знать, что FileID и путь к файлу .dbf хранятся в переменной. как пример:
Предполагая, что именем таблицы является inputoutputMapping
Добавьте задачу «Выполнить SQL» с помощью следующей команды:
DECLARE @strQuery as VARCHAR(4000)
SET @strQuery = 'SELECT '
SELECT @strQuery = @strQuery + '[' + InputColumn + '] as [' + OutputColumn + '],'
FROM inputoutputMapping
WHERE FileID = ?
SET @strQuery = SUBSTRING(@strQuery,1,LEN(@strQuery) - 1) + ' FROM ' + CAST(? as Varchar(500))
SELECT @strQuery
И в На вкладке «Сопоставление параметров» выберите переменную, содержащую FileID, который должен быть сопоставлен с параметром 0
, и переменную, содержащую имя файла .dbf (альтернативное имени таблицы) для параметра 1
. Установите ResultSet введите Single Row
и сохраните ResultSet 0
внутри переменной типа string, как в примере @[User::SourceQuery]
Значение ResultSet будет следующим:
SELECT [CustCd] as [CustCode],[CNAME] as [CustName],[Address] as [CustAdd] FROM database1
В [119 ] выберите команду «Режим доступа к таблице из SQL» из переменной и используйте переменную @[User::SourceQuery]
в качестве источника.
В этом подходе вы должны использовать компонент Script в качестве источника в задаче потока данных:
все, вам нужно передать путь файла .dbf и соединение SQL Server с компонентом сценария через переменные, если вы не хотите жестко их кодировать.
В редакторе сценариев вы должны добавить выходной столбец для каждого столбца, найденного в таблице назначения, и сопоставить их с пунктом назначения .
Внутри скрипта вы должны прочитать файл .dbf в таблицу данных:
После загрузки данных в таблицу данных также заполните другую таблицу данных данными, найденными в таблице MappingTable, созданной вами в SQL Server.
После этого выполните цикл по столбцам с данными и измените .ColumnName
на соответствующий выходной столбец, например:
foreach (DataColumn col in myTable.Columns)
{
col.ColumnName = MappingTable.AsEnumerable().Where(x => x.FileID = 1 && x.InputColumn = col.ColumnName).Select(y => y.OutputColumn).First();
}
После цикла по каждой строке в таблице данных и создайте строку вывода сценария. [ 1156]
Кроме того, обратите внимание, что при назначении выходных строк вы должны проверить, существует ли столбец, вы можете сначала добавить все имена столбцов в список строк, а затем использовать его для проверки, например:
var columnNames = myTable.Columns.Cast<DataColumn>()
.Select(x => x.ColumnName)
.ToList();
foreach (DataColumn row in myTable.Rows){
if(columnNames.contains("CustCode"){
OutputBuffer0.CustCode = row("CustCode");
}else{
OutputBuffer0.CustCode_IsNull = True
}
//continue checking all other columns
}
[ 1158] Если вам требуется более подробная информация об использовании компонента Script в качестве источника, проверьте одну из следующих ссылок:
Я не думаю, что есть другие методы, которые вы можете использовать для достижения этой цели, кроме как у вас есть выбор: постройте пакет динамически, тогда вы должны выполнить:
Недавно я начал новый проект на Git-Hub, который является библиотекой классов, разработанной с использованием C #. Вы можете использовать его для импорта табличных данных из Excel, Word, PowerPoint, Text, CSV, HTML, JSON и XML в таблицу сервера SQL с другим определением схемы с использованием подхода сопоставления схемы. проверить это по адресу:
Вы можете перейти к этой странице вики для пошагового руководства :