블로그 이미지
Every unexpected event is a path to learning for you.

카테고리

분류 전체보기 (2328)N
Unity3D (572)N
Programming (472)
Unreal (4)
Gamebryo (56)
Tip & Tech (185)
협업 (34)
3DS Max (3)
Game (12)
Utility (116)
Etc (92)
Link (31)
Portfolio (19)
Subject (90)
iOS,OSX (38)
Android (13)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (1)
Memories (19)
Interest (37)
Thinking (36)
한글 (26)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (19)
Exercise (3)
나만의 맛집 (2)
냥이 (9)
육아 (9)
Total1,346,328
Today134
Yesterday132
Statistics Graph

달력

« » 2019.12
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        

공지사항

태그목록

[주의] 레지스트리를 수정하는 내용이니 주의해서 사용하세요.



C# 으로 OleDB를 이용해서 Excel을 읽어 들이고, Sqlite(.db)로 변환하는 Converter를 만들어서 사용하는 데


긴 문자열을 넣었더니 잘려서 컨버팅 되길래 확인해보니 255 글자 제한이 걸려 있다.


검색해서 확인해보니 여러가지 해결방법들이 포스팅 돼 있는데 조금씩 안맞아서 확인해보고 정리해서 올려 놓는다.



[레지스트리 수정으로 255 글자 제한 풀기]


아래 버전 및 OS bit에 맞는 레지스트리를 찾아가서 TypeGuessRows 값을 0으로 바꾸면 된다.

(기본 값은 8인데, DataSet을 만들 때 기본으로 설정 된 윗 8줄에 있는 가장 큰 글자수를 DataType 길이로 잡는다고 한다.

 기본 글자 제한은 255자이고, 0으로 바꾸면 전체를 검사해서 DataType 길이로 잡는다고 함.)


[주의] 성능상의 이유로 글자수를 제한(Default:8) 하는 거라고 하니 


  [Windowns 32bit]

Excel 2000, 2003 (xls)

  HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel

  (Excel 97 = 3.5)


- Excel 2013 (xlsx)

  HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\15.0\Access Connectivity Engine\Engines\Excel

  (2013 = 15.0, 2010 = 14.0, 2007 = 12.0)


  [Windowns 64bit]

Excel 2000, 2003 (xls)

  HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Jet\4.0\Engines\Excel

  (Excel 97 = 3.5)


- Excel 2013 (xlsx)

  HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\15.0\Access Connectivity Engine\Engines\Excel

 (2013 = 15.0, 2010 = 14.0, 2007 = 12.0)



[레지스트리 파일 다운로드]

Fix_255_Char_32bit_Excel_2000_2003.reg

Fix_255_Char_32bit_Excel_2013.reg

Fix_255_Char_64bit_Excel_2000_2003.reg

Fix_255_Char_64bit_Excel_2013.reg



    [Excel 데이터 수정으로 255 글자 제한 풀기] (확인 안해봤음)


- 위에도 적었지만 DataSet을 만들 때 기본으로 설정 된 윗 8줄에 있는 가장 큰 글자수를 DataType 길이로 잡는다고 한다.

  8줄 이내에 255 글자 이상의 사용하지 않는 Dummy 데이터를 넣으면 해결 된다고 함. 




[참조] http://www.todal.net/241?category=367351

[참조] http://it-developer.tistory.com/427

[참조] http://lemondory.tistory.com/129

[참조] http://ariswear.tistory.com/37

Posted by blueasa
TAG 255, Excel, odbc, 짤림

댓글을 달아 주세요

  1.  
  2.         Dictionary<string, string> dict = new Dictionary<string, string>()
  3.         {
  4.             { "A""String A" },
  5.             { "B""String B" },
  6.             { "C""String C" },
  7.         };
  8.         string[] keys = new string[dict.Keys.Count];
  9.         dict.Keys.CopyTo(keys0);
  10.         for (int i = 0; i < keys.Length++i)
  11.         {
  12.             Debug.Log(dict[keys [i]]);
  13.         }
  14.  


[출처] https://forum.unity.com/threads/c-dictionary-loop.337804/

Posted by blueasa

댓글을 달아 주세요

프로그래밍을 할 때 있어서 모든 일이 처음 설계한대로 흘러간다면 얼마나 좋을까? 하지만 Hello World를 출럭하는 프로그램이 아닌 이상에야 그런 일은 있을 수 없다.


확장성을 위해, 재사용성을 위해, 더 나은 구조를 위해 코드와 설계는 변하기 마련이다. 그 와중에 많은 함수나 변수, 클래스가 추가되고 삭제된다. 물론 혼자서만 하는 작업이라면 코드를 바꾸고 바꾼 코드를 바로 적용하면 되지만, 코드 베이스를 만드는 사람과 그 베이스를 이용해서 작업하는 사람이 따로 있는 상황이라면 이야기가 조금 달라진다. 


만약 베이스를 작업하는 사람이 몇몇의 함수를 삭제하고 다른 이름의 함수로 대체했다면 그 베이스를 응용하는 사람 역시 그에 대한 사실을 알아야 한다. 물론 일반적인 상식으로 베이스 작업자가 베이스를 변경했다면 다른 작업자에게 바로 알려주고 다른 작업자는 바로 변경하는게 맞는 이야기지만, 사람과 사람 사이의 의사소통이라는게 말처럼 쉽기만 하던가. 베이스 작업자가 변경사항을 몇 개는 빠뜨리고 알려줄 수도 있고, 다른 작업자는 이야기를 들었지만 까먹을 수도 있는 일이다. 여튼 의사소통 과정에서 문제가 발생했다면 다른 작업자는 뜬금없이 바뀐 베이스 코드에 당황을 금치 못할 것이다.


그런 상황을 맞이한 다른 작업자는 당연히 문제를 해결하기 위해서 베이스 작업자에게 어떻게 변경된 것인지 물어보던지, 코드를 뒤져서 바뀐 함수를 적용하던지 하는 노력을 하겠지만 아무래도 이런 방식은 해결 속도도 느릴 뿐더러 효율적이지 못하다.


그렇기 때문에 나온 해결책이 바로 [Obsolete] 라는 어트리뷰트이다. 


class TestClass
{
    [Obsolete]
    public void Function1()
    {
    }
}


더 이상 사용하지 않거나 그럴 예정인 클래스나 함수, 변수의 앞에 [Obsolete] 어트리뷰트를 붙여주면 된다. 그렇게 하면 해당 함수를 호출할 때 초록색 밑줄과 함께 더 이상 사용하지 않는 함수라는 경고가 뜬다.



그리고 툴팁에서는 함수 앞에 [deprecated]가 붙게 된다.


이 [Obsolete]는 세 가지 방식의 오버로딩을 지원한다.


class TestClass
{

    [Obsolete]
    public void Function1()
    {

    }

    [Obsolete("Not use anymore.")]
    public void Function2()
    {

    }

    [Obsolete("Not use anymore.", true)]
    public void Function3()
    {

    }
}


[Obsolete] :: 더 이상 사용하지 않는 코드라는 경고만 출력한다.


[Obsolete(string message)] :: 더 이상 사용하지 않는다는 경고에 추가적인 메시지를 남길 수 있다. 이 메시지를 통해 더 이상 사용하지 않는 코드 대신에 사용할 코드를 사용자에게 알릴 수 있다.


[Obsolete(string message, bool error)] :: 추가적인 로그와 함께 이 코드를 사용할 경우에 컴파일 에러를 띄울지를 결정한다. true를 넣어주면 컴파일 에러를 띄워서 이 코드를 사용하면 컴파일을 할 수 없게 된다.



이런 식으로 [Obsolete]를 적절하게 사용하면 베이스 작업자는 코드 작업만으로 다른 작업자에게 코드가 변경되었음을 알림과 동시에 그에 대한 해결책도 전해줄 수 있다. 베이스 작업자가 코드를 변경하고 다른 작업자에게 변경사항을 일일이 알리는 것보다 훨씬 빠르고 효율적인 해결책이다.



출처: http://wergia.tistory.com/23 [베르의 프로그래밍 노트]



참조 : http://answers.unity3d.com/questions/559529/how-to-mark-a-method-obsolete.html

Posted by blueasa

댓글을 달아 주세요

string을 byte[] 배열로 변환? 

string 문자열을 C#의 Char[] 배열로 변경하는 것은 String 클래스의 ToCharArray()라는 메서드를 사용하면 간단하다. 그렇다면, string은 byte[] 배열로 변경하는 것은 가능한가? 만약 가능했다면, string 클래스 안에 ToByteArray() 같은 메서드가 존재할 듯 한데, 이런 메서드는 존재하지 않는다. 왜냐하면, String은 직접 byte[] 변경할 수 없기 때문이다. 먼저 반대의 경우를 생각해 보자. byte[]를 직접 string으로 변경할 수 있는가? 이를 위해 우선 byte[] 가 어떤 Charset을 가지고 인코딩(Encoding) 되었는지 알아야 할 것이다. 이는 아스키, 유니코드, UTF8, GB18030 등 다양한 인코딩 방식에 따라 바이트들이 의미하는 문자가 완전히 다르기 때문이다. 따라서 byte배열을 .NET의 유니코드 string으로 변경하기 위해서는 해당 바이트가 어떤 인코딩인지 알고 이를 유니코드 String으로 변경하게 된다. 동일한 로직으로 문자열을 Byte배열로 변경할 때도 인코딩 방식에 따라 다른 바이트값들을 갖게 된다. 



String을 Byte[]로 인코딩 

문자열을 Byte[] 배열로 변경하기 위해서는 System.Text.Encoding의 인코딩 방식을 지정한 후 GetBytes() 메소드를 호출하면 된다. 예를 들어, 유니코드 인코딩을 사용하여 Byte[]로 변환하는 경우, System.Text.Unicode.GetBytes() 메서드를 호출하고, UTF8 인코딩을 사용하는 경우, System.Text.UTF8.GetBytes() 메서드를 호출하면 된다. 

예제

// String을 Char[]로 변환 
string str = "Hello 한국";
char[] uchars = str.ToCharArray();

// String은 바이트로 직접 변환할 수 없으며,
// Encoding을 통해 변환 가능. 16바이트 생성
byte[] ubytes = System.Text.Encoding.Unicode.GetBytes(str);

// 보다 컴팩트한 UTF8 인코딩. 12바이트 생성
byte[] utf8bytes = System.Text.Encoding.UTF8.GetBytes(str);




Byte[]을 String으로 변환 

Byte[] 배열을 String으로 변환하기 위해서는 바이트로 인코딩했던 동일한 인코더를 사용하여야 한다. 즉, 유니코드 인코더를 사용하여 String은 Byte[]로 변환했었다면 Encoding.Unicode.GetString()을 사용하여 Byte 배열을 문자열로 변경한다. 

예제

using System.Text;

// Byte Array를 String으로 변환 
string s1 = Encoding.Unicode.GetString(uniBytes);
string s2 = Encoding.UTF8.GetString(utf8bytes);




char[]을 String으로 변환 

char[] 배열을 String으로 변환하는 것은 간단하다. C#에서 char는 이미 유니코드이고, string 문자열은 이런 유니코드 문자 요소들의 집합이므로 String 생성자에 문자배열을 직접할당하여 변환할 수 있다. 




BASE64 인코딩 

Byte[] 배열을 웹상에서 전송하기 위해 많이 사용되는 방식으로 BASE64 인코딩을 들 수 있다. 송신 쪽에서는 Convert.ToBase64String(byte[])를 사용하여 바이트들을 BASE64 인코딩된 문자열로 변경하고 String을 전송하게 되고, 수신 쪽에서는 Convert.FromBase64String(string)을 사용하여 BASE64 인코딩된 문자열을 다시 바이트 배열로 변경하여 사용하게 된다. 

예제

// Byte Array를 BASE64 Encoding
string s64 = Convert.ToBase64String(utf8bytes);

// BASE64 인코딩한 String을 다시 Byte Array로
byte[] bytes64 = Convert.FromBase64String(s64);



[출처] http://www.csharpstudy.com/Tip/Tip-string-encoding.aspx

Posted by blueasa
TAG byte[], string

댓글을 달아 주세요

[펌] 반복문 유틸

Programming/C# / 2016. 12. 7. 17:54
// 반복문 관련
    // For Array
    public static void ForToArray

(T[] pArray, Action pCallback) { if (null == pArray) return; if (null == pCallback) return; int iMaxCount = pArray.Length; for (int iLoop=0; iLoop < iMaxCount; ++iLoop) { pCallback(pArray[iLoop]); } } // For Enum public static void ForToEnum(Action pCallback) { var pEnumerator = Enum.GetValues(typeof(T)).GetEnumerator(); while (pEnumerator.MoveNext()) { pCallback((T)pEnumerator.Current); } } // For List public static void ForToList(List pList, Action pCallback) { if (null == pList) return; if (null == pCallback) return; int iMaxCount = pList.Count; for (int iLoop = 0; iLoop < iMaxCount; ++iLoop) { pCallback(pList[iLoop]); } } public static void ForToList(List pList, Func pCallback) { if (null == pList) return; if (null == pCallback) return; int iMaxCount = pList.Count; for (int iLoop = 0; iLoop < iMaxCount; ++iLoop) { if (true == pCallback(pList[iLoop])) break; } } // For Dictionary public static void ForToDic(Dictionary pDic, Action pCallback) { if (null == pDic) return; if (null == pCallback) return; var pEnumerator = pDic.GetEnumerator(); while (pEnumerator.MoveNext()) { var kvp = pEnumerator.Current; pCallback(kvp.Key, kvp.Value); } } public static void ForToDic(Dictionary pDic, Func pCallback) { if (null == pDic) return; if (null == pCallback) return; var pEnumerator = pDic.GetEnumerator(); while (pEnumerator.MoveNext()) { var kvp = pEnumerator.Current; if (true == pCallback(kvp.Key, kvp.Value)) break; } } // For One public static void For(int iStartIndex, int iMaxIndex, Action pCallback) { for (int iLoop = iStartIndex; iLoop pCallback) { for (int iLoop = iStartIndex; iLoop < iMaxIndex; ++iLoop) { if (true == pCallback(iLoop)) break; } } // For Double public static void ForToDouble(int iMaxToFirst, int iMaxToSecond, Action pCallback) { for (int iLoop1 = 0; iLoop1 < iMaxToFirst; ++iLoop1) { for (int iLoop2 = 0; iLoop2 < iMaxToSecond; ++iLoop2) pCallback(iLoop1, iLoop2); } } public static void ForToDouble(int iMaxToFirst, int iMaxToSecond, Func pCallback) { for (int iLoop1 = 0; iLoop1 < iMaxToFirst; ++iLoop1) { for (int iLoop2 = 0; iLoop2 < iMaxToSecond; ++iLoop2) { if (true == pCallback(iLoop1, iLoop2)) return; } } } // Inverse For Double public static void ForInverseToDouble(int iMaxToFirst, int iMaxToSecond, Action pCallback) { for (int iLoop1 = iMaxToFirst; iLoop1 >= 0; --iLoop1) { for (int iLoop2 = iMaxToSecond; iLoop2 >= 0; --iLoop2) pCallback(iLoop1, iLoop2); } } public static void ForInverseToDouble(int iMaxToFirst, int iMaxToSecond, Func pCallback) { for (int iLoop1 = iMaxToFirst; iLoop1 >= 0; --iLoop1) { for (int iLoop2 = iMaxToSecond; iLoop2 >= 0; --iLoop2) { if (true == pCallback(iLoop1, iLoop2)) return; } } }


[출처] 이상호

Posted by blueasa

댓글을 달아 주세요

[펌] Loop Dictionary

Programming/C# / 2016. 12. 7. 17:43
Code (CSharp):
  1. var enumerator = my_dictionary.GetEnumerator();
  2. while( enumerator.MoveNext() )
  3. {
  4.     // Access value with enumerator.Current.Value;
  5. }



[출처] https://forum.unity3d.com/threads/c-dictionary-loop.337804/

'Programming > C#' 카테고리의 다른 글

[펌] string을 byte[] 배열로 변환?  (0) 2017.01.10
[펌] 반복문 유틸  (0) 2016.12.07
[펌] Loop Dictionary  (0) 2016.12.07
[펌] String -> enum 변환  (0) 2016.05.23
[펌] C# - 정규식을 이용한 문자 변환  (0) 2016.04.15
[C#] 시간체크(Stopwatch)  (0) 2015.09.15
Posted by blueasa

댓글을 달아 주세요

I've come across the situation on a number of occasions when coding where I've wanted to convert from a string to an enum. In the Media Catalog sample, I resorted to one giant switch statement that has a case block for each string that returns an enum from it.

One of my colleagues came up with the answer yesterday; it's one of those methods that you can never find when you're looking for it, but once discovered it seems blindingly obvious:

   object Enum.Parse(System.Type enumType, string value, bool ignoreCase);

So you can write the following kind of code:

   enum Colour
   {
      Red,
      Green,
      Blue
   } 

   // ...
   Colour c = (Colour) Enum.Parse(typeof(Colour), "Red", true);
   Console.WriteLine("Colour Value: {0}", c.ToString());

   // Picking an invalid colour throws an ArgumentException. To
   // avoid this, call Enum.IsDefined() first, as follows:
   string nonColour = "Polkadot";

   if (Enum.IsDefined(typeof(Colour), nonColour))
      c = (Colour) Enum.Parse(typeof(Colour), nonColour, true);
   else
      MessageBox.Show("Uh oh!");

What a time saver - thanks, Simon!

Footnote: interestingly, whilst writing this up I noticed that Enum.IsDefined() doesn’t offer the ignoreCase parameter. If you don’t know whether the casing is right, it seems the only way to do the conversion is using the Parse method and catching the ArgumentException. That's not ideal, since it runs a lot slower. I wonder if this is a loophole in the design; no doubt someone like Brad could cast light on it...

posted on Friday, April 02, 2004 1:49 PM

Feedback

# re: How do you convert a string into an enum? 4/2/2004 7:22 PM SBC

You can get the string values of enums also by calling Enum.GetNames or Enum.GetName...




출처 : http://redccoma.tistory.com/117

Posted by blueasa

댓글을 달아 주세요

정규식을 이용하여 특정 문자만 얻는 방법을 알아보겠습니다.


- Namespace : System.Text.RegularExpressions

- Class : Regex

- Method : 

 public static string Replace(

string input,

string pattern,

string replacement

 )


1. 숫자만 얻기

 - 정규식 : [^0-9]

1
2
3
4
5
6
string str = "Englsh@korea$101299**한글";
 
// 숫자만 0-9
str = Regex.Replace(str, @"[^0-9]""");
 
// 결과 : 101299
cs

2. 영문자만 얻기

 - 정규식 : [^a-zA-Z]

1
2
3
4
5
6
string str = "Englsh@korea$101299**한글";
 
// 영문자 a-z A-Z
str = Regex.Replace(str, @"[^a-zA-Z]""");
 
// 결과 : Englshkorea
cs


3. 한글만 얻기

 - 정규식 : [^가-힣]

1
2
3
4
5
6
string str = "Englsh@korea$101299**한글";
 
// 한글만 가-힣
str = Regex.Replace(str, @"[^가-힣]""");
 
// 결과 : 한글
cs


4. 특수문자 제거

  - 정규식 : [^0-9a-zA-Z가-힣]

1
2
3
4
5
string str = "Englsh@korea$101299**한글";
// 특수문자 제거
str = Regex.Replace(str, @"[^0-9a-zA-Z가-힣]""");
 
// 결과 : Englshkorea101299한글
cs


※ 위의 예에서와 같이 정규식을 잘 이용하면 얻고자 하는 문자를 쉽게 처리 할 수 있습니다.



[출처]

http://docko.tistory.com/entry/C-%EC%A0%95%EA%B7%9C%EC%8B%9D%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EB%AC%B8%EC%9E%90-%EB%B3%80%ED%99%98

Posted by blueasa
TAG 정규식

댓글을 달아 주세요

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using System.Diagnostics;
  
Stopwatch SW = new Stopwatch();
string sTemp1, sTemp2;
 
SW.Reset();
SW.Start();
 
// " 측정할 부분 작성 "
SW.Stop();
 
// 현재 인스턴스가 측정한 총 경과 시간을 가져옵니다.
sTemp1 = SW.Elapsed.ToString();                             // EX) "00:00:00.0000045"
// 현재 인스턴스가 측정한 밀리초 단위의 총 경과 시간을 가져옵니다
sTemp2 = SW.ElapsedMilliseconds.ToString() ;          // EX) "44"


출처 : http://overit.tistory.com/entry/C-%EC%8B%9C%EA%B0%84%EC%B2%B4%ED%81%ACStopwatch

Posted by blueasa

댓글을 달아 주세요

참조) http://blog.naver.com/goldrushing/130147289978

 

 

http://blog.naver.com/bridman/40195903160



 

참조에 위 Microsoft Excel 14.0 Object Library 를 추가하고 빌드를 하면 개발PC에서는 실행이 잘되지만

오피스가 설치되지 않은 다른 PC에서는 오류가 발생한다.

 

[오류] 'Microsoft.ACE.OLEDB.12.0' 공급자는 로컬 컴퓨터에 등록할 수 없습니다.

 

라는 오류 발생시 다음주소의 설치파일을 다운로드하여 설치해주면 된다.

 

http://www.microsoft.com/ko-kr/download/details.aspx?id=13255

 

나의 경우 64Bit PC여서 64Bit용으로 받아서 설치해주었다.

 

물론 Build시에도 AnyPC또는 64Bit용으로 빌드를 해주었다.




출처 : http://mydoh.tistory.com/63

Posted by blueasa

댓글을 달아 주세요