.cloneNode()
и .replaceChild()
] На 5% быстрее, чем ВСЕ примеры
(включая принятый ответ)
Следующий пример взят из Range API :
blockquote>const rng = document.createRange(); rng.selectNodeContents(document.querySelector('ul')); rng.deleteContents();
интерфейс Range работает с фрагментами документа, состоящими из узлов и текста. Хотя он выглядит медленным , на самом деле он быстрый и на 100% совместим со всеми браузерами .
Range Range
blockquote>
.createRange()
[1152].selectNodeContents()
.deleteContents()
.replaceWith()
и.createElement()
на 15% медленнее, чем все примеры
Это комбо быстрее большинства примеров и менее многословно (за исключением диапазона демонстрация - самая быстрая.)blockquote>document.querySelector('ul').replaceWith(document.createElement('ul'));
Это 2 взаимодействия DOM: найдите список и замените его пустым списком. См. Демонстрацию 1. Если вы хотите поддерживать IE11 (глобальная доля ATM 2,26%) , не используйте его.
Демонстрация 1
API диапазона
const rng = document.createRange(); rng.selectNodeContents(document.querySelector('ul')); rng.deleteContents();
ul { min-height: 30px; min-width: 30px; outline: 1px dashed red; }
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
[ 1166] Демонстрация 2
.replaceWith()
и.createElement()
document.querySelector('ul').replaceWith(document.createElement('ul'));
ul { min-height: 30px; min-width: 30px; outline: 1px dashed red; }
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
.insertAdjacentHTML()
и amp;.createDocumentFragment()
@ 50% медленнее, чем все примеры
Лучший способ оптимизировать любые манипуляции с DOM - не иметь их. Держите доступ DOM к минимуму - это очень много времени. Каждый раз, когда механизм JS ищет элемент, он будет проходить по дереву DOM, каждый раз, когда тег добавляется или удаляется, узлы (элемент, текст и т. Д.), Которые уже находятся в DOM, должны пересчитываться для определения местоположения и размеров, чтобы даже если количество задействованных узлов всего несколько, это может привести к исключительно длительному процессу для браузера. Это называется reflow, и похожая проблема, связанная со стилями CSS, называется перерисовкой.
Следующая демонстрация удаляет всев
с 4 операциями DOM:
blockquote>
Ссылается на поиск
]- 1
Ссылочный родительский элемент
добавляет пустой
- 1 поиск, 1 добавление
Создайте
documentFragment
и добавьте оригинал [ 1128] к нему - 1 удаление
.insertAdjacentHTML()
без деструктивного рендерингаhtmlString
в HTML и он очень оптимизирован .
.createDocumentFragment()
никогда не касается DOM и все, что к нему прикреплено, больше не касается DOM.Демонстрация 3
.insertAdjacentHTML
и.createDocumentFragment()
]// Reference the
const list = document.querySelector('ul'); // Reference parent of
append an empty
list.parentElement.insertAdjacentHTML('beforeend', `
`); // Create a document fragment and append original
to it document.createDocumentFragment().appendChild(list);
ul { min-height: 30px; min-width: 30px; outline: 1px dashed red; }
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
- ITEM
Я знаю, что это не действительное решение, но я использую фиктивную таблицу для импорта с набором nvarchar для всего. Тогда я делаю вставку, которая разделяет "символы и делает преобразования. Это не симпатично, но это делает задание.
Это старый вопрос, поэтому я пишу его, чтобы помочь любому, кто наткнется на него.
SQL Server 2017 вводит параметр FIELDQUOTE, который предназначен для этого конкретного случая использования.
Если Вы выясняете, как проанализировать файл в DataTable, я предложил бы класс SqlBulkInsert для вставки его в SQL Server.
У вас есть контроль над форматом ввода? | (трубы), и \ t обычно делают для лучших терминаторов поля.
Да, K Richard является правильным: FIELDTERMINATOR = '","'
См. http://www.sqlteam.com/article/using-bulk-insert-to-load-a-text-file для большего количества информации
u может попробовать этот код, который очень сладок, если Вы захотите, это удалит нежелательные точки с запятой из Вашего кода. если, например, Ваши данные похожи на это:
"Kelly", "Reynold", "kelly@reynold.com"
Bulk insert test1
from 'c:\1.txt' with (
fieldterminator ='","'
,rowterminator='\n')
update test1<br>
set name =Substring (name , 2,len(name))
where name like **' "% '**
update test1
set email=substring(email, 1,len(email)-1)
where email like **' %" '**
Во-первых, вам нужно импортировать файл CSV в таблицу данных
Затем вы можете вставить объемные строки с помощью SQLBulkCopy
using System;
using System.Data;
using System.Data.SqlClient;
namespace SqlBulkInsertExample
{
class Program
{
static void Main(string[] args)
{
DataTable prodSalesData = new DataTable("ProductSalesData");
// Create Column 1: SaleDate
DataColumn dateColumn = new DataColumn();
dateColumn.DataType = Type.GetType("System.DateTime");
dateColumn.ColumnName = "SaleDate";
// Create Column 2: ProductName
DataColumn productNameColumn = new DataColumn();
productNameColumn.ColumnName = "ProductName";
// Create Column 3: TotalSales
DataColumn totalSalesColumn = new DataColumn();
totalSalesColumn.DataType = Type.GetType("System.Int32");
totalSalesColumn.ColumnName = "TotalSales";
// Add the columns to the ProductSalesData DataTable
prodSalesData.Columns.Add(dateColumn);
prodSalesData.Columns.Add(productNameColumn);
prodSalesData.Columns.Add(totalSalesColumn);
// Let's populate the datatable with our stats.
// You can add as many rows as you want here!
// Create a new row
DataRow dailyProductSalesRow = prodSalesData.NewRow();
dailyProductSalesRow["SaleDate"] = DateTime.Now.Date;
dailyProductSalesRow["ProductName"] = "Nike";
dailyProductSalesRow["TotalSales"] = 10;
// Add the row to the ProductSalesData DataTable
prodSalesData.Rows.Add(dailyProductSalesRow);
// Copy the DataTable to SQL Server using SqlBulkCopy
using (SqlConnection dbConnection = new SqlConnection("Data Source=ProductHost;Initial Catalog=dbProduct;Integrated Security=SSPI;Connection Timeout=60;Min Pool Size=2;Max Pool Size=20;"))
{
dbConnection.Open();
using (SqlBulkCopy s = new SqlBulkCopy(dbConnection))
{
s.DestinationTableName = prodSalesData.TableName;
foreach (var column in prodSalesData.Columns)
s.ColumnMappings.Add(column.ToString(), column.ToString());
s.WriteToServer(prodSalesData);
}
}
}
}
}
Необходимо ли сделать это программно, или действительно ли это - одноразовый выстрел?
Используя Руководителя предприятия, щелкните правой кнопкой по Import Data, позволяет Вам выбрать свой разделитель.
Я бы сказал, использовать FileHelpers - это библиотека с открытым исходным кодом.
Попробуйте OpenRowSet. Это может использоваться для импорта материала Excel. Excel может открыть файлы CSV, таким образом, только необходимо выяснить корректный [ConnectionString][2].
[2]: Драйвер = {текстовый Драйвер Microsoft (*.txt; *.csv)}; Dbq=c:\txtFilesFolder\; Extensions=asc, csv, вкладка, txt;
Еще один хак, который я иногда использую, - это открыть CSV в Excel, а затем записать свой SQL-оператор в ячейку в конце каждой строки. Например:
=concatenate("insert into myTable (columnA,columnB) values ('",a1,"','",b1,"'")")
Заполнение может заполнить это в каждой строке для вас. Затем просто скопируйте и вставьте вывод в новое окно запроса.
Это старая школа, но если вам нужно делать импорт время от времени, это избавит вас от необходимости возиться с чтением всей непонятной документации о «правильном» способе сделать это.
Попробуйте FIELDTERMINATOR='","'
, Вот большая ссылка, чтобы помочь с первой и последней кавычкой... посмотреть, как он использовал подстроку SP
http://www.sqlteam.com/article/using-bulk-insert-to-load-a-text-file
Необходимо предостеречься с BCP/BULK INSERT, потому что никакой BSP или Объемная Вставка не обрабатывают это хорошо, если заключение в кавычки не последовательно, даже с файлами формата (даже файлы формата XML не предлагают опции), и макет ["] символы вначале, и закончите и использующий [""] как разделитель. Технически файлы CSV не должны иметь ["] символов, если существует не встроено [] символы
Именно по этой причине, файлы разделенных запятыми значений иногда упоминаются как ограниченные комедией файлы.
OpenRowset потребует Excel на сервере и мог быть проблематичным в 64-разрядных средах - я знаю, что это - проблематичное использование Excel в Струе в 64-разрядном.
SSIS является действительно Вашим лучшим выбором, если файл, вероятно, будет варьироваться от Ваших ожиданий по будущему.